2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part92

1 :デフォルトの名無しさん:2011/11/04(金) 01:58:02.00
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part91
http://hibari.2ch.net/test/read.cgi/tech/1315922506/

このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1312621728/

ついでに壁紙にしてね。
http://www2.research.att.com/~bs/Bjarne.jpg

2 :デフォルトの名無しさん:2011/11/04(金) 01:58:53.59
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。

3 :デフォルトの名無しさん:2011/11/04(金) 01:59:43.54
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

4 :デフォルトの名無しさん:2011/11/04(金) 02:00:25.16
■Books■
amazon C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
 http://www.amazon.co.jp/b/?node=754384

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)

5 :デフォルトの名無しさん:2011/11/04(金) 02:01:09.37
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

6 :デフォルトの名無しさん:2011/11/04(金) 02:20:57.01
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

7 :デフォルトの名無しさん:2011/11/04(金) 07:40:38.35
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

地鎮祭終了>>1

8 :デフォルトの名無しさん:2011/11/05(土) 12:49:24.51
落ちるぞ。

9 :デフォルトの名無しさん:2011/11/05(土) 19:50:36.17
>>1
おつ

10 :デフォルトの名無しさん:2011/11/05(土) 20:34:16.48
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg

11 :デフォルトの名無しさん:2011/11/05(土) 23:55:51.53
びよーんすぽすぽがどうした?

12 :デフォルトの名無しさん:2011/11/06(日) 01:51:28.66
禿は女の尿を飲み続けると改善するらしい

13 :デフォルトの名無しさん:2011/11/06(日) 15:39:49.29
>>11
愛玩用人工知能KAZAMAを開発して地下室で生活してたのがバレた。

14 :デフォルトの名無しさん:2011/11/06(日) 21:20:47.23
禿本 4th マダー?tntn
俺あいつの語り口がけっこー好みなんだが入門いらね

15 :デフォルトの名無しさん:2011/11/06(日) 22:00:17.24
英語で読むのか、なあ、英語で読んじゃうのかウワァァァァァァヽ(`Д´)ノァァァァァァン!

16 :デフォルトの名無しさん:2011/11/06(日) 22:24:07.01
>>15
英語英語がたがた抜かすな。
コードは世界共通だ。
恐れることはない。


17 :デフォルトの名無しさん:2011/11/07(月) 00:09:55.73
むしろコード読んでから解説読んでフムフムするんだ

18 :デフォルトの名無しさん:2011/11/07(月) 00:56:46.36
そうそう


19 :デフォルトの名無しさん:2011/11/07(月) 01:50:25.19
class A{
public:
virtual void B(){
//何か
}
void C(){
B();
}
};
class exA:public A{
public:
void B(){
//何か
}
};

exA ex;
ex.C();//class AのB関数を呼ぶ。

exAのC()でclass AのB関数でなくclass exAのB関数を呼び出してもらいたいんだけど、

C関数をvirtualにしてexA関数で再定義する以外に方法ある?

20 :デフォルトの名無しさん:2011/11/07(月) 01:56:02.79
exAでBをoverrideしなきゃいいんじゃね。
てか、親classから派生classの関数を呼び出す処理は往々にして糞だ。

21 :デフォルトの名無しさん:2011/11/07(月) 01:59:16.20
ネーミングセンスがないな

22 :デフォルトの名無しさん:2011/11/07(月) 02:00:20.97
>>19
意図してる方法かしらんけど、
Cの中で、A::B();とすれば、AのB()が呼ばれるようになる。
ただし、派生先がどうであれ、B()は常にAのB();が呼ばれてしまう。
あとは、テンプレを使って、Type::B()の形式で呼び出すとか。

23 :デフォルトの名無しさん:2011/11/07(月) 02:35:35.29
>>20
糞ですまん。
C関数の中のB関数以降は全く同じ処理だから楽出来るかなとおもいまして。

>>21
ネーミングは気にしないでくれ。

>>22
template<class Func>
void C(){
Func::B();
};
こんな形ですか?

24 :デフォルトの名無しさん:2011/11/07(月) 07:37:16.19
>>19
そのソースで意図した動作ができてると思うんだけど、何か気に入らないの?
http://codepad.org/ENTqMxOP

25 :デフォルトの名無しさん:2011/11/07(月) 07:58:56.01
これってNVIだよね

26 :デフォルトの名無しさん:2011/11/07(月) 09:43:22.64
共変の戻り値とNVIイディオムを同時に使おうとするとやはり変
仮想関数の意味ないんじゃねこれじゃ

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Base::put"); }
private:
virtual Base* duplicate_xxx () { return this; };
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Derived::put"); }
private:
virtual Derived* duplicate_xxx () { return this; };
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->put();
d->put();

delete d;
delete b;
}

27 :デフォルトの名無しさん:2011/11/07(月) 10:14:33.26
>>26
そのコードでどんな動作を期待してて何がどう変なんだ?

28 :デフォルトの名無しさん:2011/11/07(月) 10:19:48.84
うんこコードの量産を期待して頭が変です

29 :デフォルトの名無しさん:2011/11/07(月) 10:22:07.44
>>26
duplicate()がスマートポインタを返す設計で使えるかも?

30 :デフォルトの名無しさん:2011/11/07(月) 11:04:13.01
C++11 の変更点をまとめた専門書ってありますか?

31 :デフォルトの名無しさん:2011/11/07(月) 11:04:28.61
>>27
仮想関数ならb->putでDerivedの方のput()を呼び出してくれるんじゃないのかい

32 :デフォルトの名無しさん:2011/11/07(月) 11:20:23.17
設計直せでFA

33 :デフォルトの名無しさん:2011/11/07(月) 12:05:24.51
>>31
putが仮想関数ならそうだが>>26のputは仮想関数ではないしNVI使ってもないだろ。putにNVI使うなら

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

34 :デフォルトの名無しさん:2011/11/07(月) 12:55:35.63
>>33
サンクス
なるほどduplicateではなくてputをNVIイディオムにしなければいけないのでした
やろうとしていた事はduplicateが返したthisからputを呼び出す事でした
勘違いしてたようです

35 :デフォルトの名無しさん:2011/11/07(月) 12:59:21.63
あーこれでもだめですね
二重にNVIを使わないといけないのか

#include <cstdio>

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Base::put"); }
private:
virtual Base* duplicate_xxx () { return this; };
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Derived::put"); }
private:
virtual Derived* duplicate_xxx () { return this; };
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->duplicate()->put();
d->duplicate()->put();

delete d;
delete b;
}

36 :デフォルトの名無しさん:2011/11/07(月) 13:01:44.70
これでOKでしたありがとうございました

struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base* b = new Derived;
Derived* d = new Derived;

b->duplicate()->put();
d->duplicate()->put();

delete d;
delete b;
}

37 :デフォルトの名無しさん:2011/11/07(月) 13:01:48.66
>>30
MayersがPDF売ってるよ

38 :デフォルトの名無しさん:2011/11/07(月) 13:58:15.69
>>36
duplicateをどういうものにしたいのかわからないけど(Derived*を返す必要が本当にあるのか?)
基底クラスのpublicな非仮想メンバ関数を派生クラスで再定義・隠蔽するのはNVIではないよ

struct Base {
Base * duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};

struct Derived : public Base {
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};

int main()
{
Base * b1(new Base);
Base * b2(new Derived);
Derived * d(new Derived);

b1->duplicate()->put();
b2->duplicate()->put();
d->duplicate()->put();

delete d;
delete b2;
delete b1;
}

39 :デフォルトの名無しさん:2011/11/07(月) 14:54:27.17
>>38
NVIと仮想関数の返す値を共変にするのを両立させたかったんです
やはり両立は無理ですかね?

40 :デフォルトの名無しさん:2011/11/07(月) 17:14:17.92
>>39
NVIは継承に関して不変だからムリだな
おとなしく仮想関数をインターフェースにしたほうがいいと思うよ

41 :デフォルトの名無しさん:2011/11/07(月) 17:19:16.29
何がしたいのかわからん

42 :デフォルトの名無しさん:2011/11/07(月) 17:20:59.14
>>40
いやここ見てたんですよ

http://d.hatena.ne.jp/tueda_wolf/20110125/p1

という事はこのブログは間違いですかね?

43 :デフォルトの名無しさん:2011/11/07(月) 17:34:50.92
>>42
もしもしなのでちょっと読んだだけだけど、これは単にそれっぽく隠蔽しただけなのでは……
仮想関数使った共変と振る舞いが一致しない場合があると思うんだけど


あと
>隠蔽(オーバーロード)
ってのは確実に誤りだな

44 :デフォルトの名無しさん:2011/11/07(月) 17:43:46.05
やっぱりですね
ありがとうございました

45 :デフォルトの名無しさん:2011/11/07(月) 17:56:36.65
共変返り値ってあって嬉しかったこと一度もないんだけどどんなときに使うの?

46 :デフォルトの名無しさん:2011/11/07(月) 18:02:50.52
よく考えると確かにないですね
どうせ返り値ってポインタだし、仮想関数で勝手に切り替えてくれるのですから
基底クラスへのポインタが返ればそれにNVIを適用すれば十分なはずです

47 :デフォルトの名無しさん:2011/11/07(月) 23:12:21.62
>>45
派生クラスメンバーの戻り値をコピーしたい場合。

Base b = object.OrverrideFunction(); //OrverrideFunctionは親の定義だとBase
Derived d = object.OrverrideFunction(); //共変の戻り値が使えないとコンパイルエラー

48 :デフォルトの名無しさん:2011/11/07(月) 23:22:06.84
>>47
そのobjectの型はDerivedなんでしょ?
だったら別にわざわざオーバーライドした関数呼ぶ必要ないじゃん


49 :デフォルトの名無しさん:2011/11/07(月) 23:23:58.61
紛らわしいけど、objectは全然違う型。

50 :デフォルトの名無しさん:2011/11/07(月) 23:25:41.14
struct Base {};
struct Derived : Base {};

struct BaseObj { virtual Base & OverridedFunction(); };
struct DerivedObj { Derived & OverridedFunction(); };

DerivedObj object;


じゃあこういう状況?

51 :デフォルトの名無しさん:2011/11/07(月) 23:27:19.72
>>50
そういう話

52 :デフォルトの名無しさん:2011/11/07(月) 23:35:22.88
>>51
DerivedObjの型がわかってるなら仮想関数を使う必要性がないのでは?
まあべつに使ってもいいけどオーバーヘッド増えるからこうしたほうがいいでしょ

struct DerivedObj : BaseObj {
/*inline*/ Derived & NonOverrided();
virtual Derived & OverridedFunction() { return NonOverrided(); }
};

Derived d = object.NonOverrided();


53 :デフォルトの名無しさん:2011/11/07(月) 23:40:32.75
>>52
親クラスほっといて、子クラス単品で使う分にはオーバヘッドはない。

DerivedHolder object;
Deriverd d = object.OverrideFunction();
(BaseHolder*)にobjectを突っ込んでるわけじゃないのでインライン展開される

54 :デフォルトの名無しさん:2011/11/07(月) 23:43:42.36
なるほどなっとくした

55 :デフォルトの名無しさん:2011/11/08(火) 23:57:43.27
classの継承でpublic継承はよく使うけどprivate継承とprotected継承はどんな時に使うの?

56 :デフォルトの名無しさん:2011/11/09(水) 00:03:13.46
boost::noncopyableはprivate継承する
他はあまり見ないな

57 :デフォルトの名無しさん:2011/11/09(水) 01:20:06.02
boost::operatorsもprivateでOKだっけ?
どういう原理か知らないけど。

58 :デフォルトの名無しさん:2011/11/09(水) 01:25:44.27
friendは継承しないから

59 :デフォルトの名無しさん:2011/11/09(水) 01:51:38.78
>>55
プライベートは「それを実装手段とする」
プロテクテッドは不明。

ってメイヤーが。

60 :デフォルトの名無しさん:2011/11/09(水) 02:00:18.67
private継承はあるクラスの内部処理に別のクラスのprotectedメンバを使いたいがpublicメンバは公開したくないときとかに使う、らしい

61 :デフォルトの名無しさん:2011/11/09(水) 07:19:46.96
noncopyableの場合はnoncopyableにアップキャストしたくないからprivate継承する
メンバを公開しないだけじゃなく、
アップキャストとスライシングを禁止するために使える

62 :デフォルトの名無しさん:2011/11/09(水) 09:57:08.59
非virtualデストラクタを持つクラスを継承するときにprotectedを使うらしい

63 :デフォルトの名無しさん:2011/11/09(水) 10:36:30.86
>>62
private に比べて何がうれしいの?

64 :デフォルトの名無しさん:2011/11/09(水) 21:02:09.32
>>55
class Base
{
protected:
      virtual int Handle(void) = 0;
      static int PeekHandle( Base &base ) { return Handle(); }
};

struct Derived:private Base
{
       Derived( Base &base ){ int handle = PeekHandle( base );
};

privateならこういう使い方もある。
Derivedは他のBaseを覗き見るが、自分は見られないようにできる。
protected継承した場合は、その派生クラスがわざわざもう一回、
Baseを継承しなくて済むようになる。

65 :デフォルトの名無しさん:2011/11/09(水) 21:49:59.60
>>63
公開したいメンバをpublicでusingすれば
あとはそのままアクセス制限を継承できるからじゃね?
まあさらに継承しない場合は関係ないだろうけど

66 :デフォルトの名無しさん:2011/11/09(水) 23:49:04.92
>>65
ごめん private との違いが見えてこない。

67 :デフォルトの名無しさん:2011/11/10(木) 00:52:32.65
>>65
そういや、あのusingって何のためにあるんだっけ?
単に 親クラス::メンバー; って書いても同じだよね。

68 :デフォルトの名無しさん:2011/11/10(木) 00:55:15.03
派生クラスは継承したんじゃなかったんかいバカヤロー
に対するしどろもどろな顛末が using

69 :デフォルトの名無しさん:2011/11/10(木) 01:04:18.25
>>66
そういやprotected継承だと孫クラスが、thisを親クラスを引数にとる関数に渡せるって点がある。
private継承だと、孫と親は同じオブジェクトだと解っててもキャストできない。
親クラスを取る関数に孫を渡したいが、外部からむやみに親にアクセスされたくない場合に多少つかえる。

70 :デフォルトの名無しさん:2011/11/10(木) 01:10:10.38
>>68
ん? 親クラス::メンバー; じゃ孫からは、メンバーとみなされないってこと?

71 :デフォルトの名無しさん:2011/11/10(木) 01:14:06.20
>>69
protected データメンバ並みに要らんな。

72 :デフォルトの名無しさん:2011/11/10(木) 01:14:32.49
>>69 C++ でおk

73 :デフォルトの名無しさん:2011/11/10(木) 02:41:42.27
protectedが必要になった時点で何かおかしいから見直す

74 :デフォルトの名無しさん:2011/11/10(木) 02:53:20.98
>>73
protectedデストラクタは必要だろ

75 :デフォルトの名無しさん:2011/11/10(木) 02:55:37.00
継承の話だろ

76 :デフォルトの名無しさん:2011/11/10(木) 03:05:35.65
それなら必要ない

77 :デフォルトの名無しさん:2011/11/10(木) 09:15:07.29
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。

78 :デフォルトの名無しさん:2011/11/10(木) 12:35:07.45
>>77
そういうのをpublicにするの?おかしいだろう
派生クラスにだけ公開すると機能は明確だし。必要な時だけ使えばいいんだし

79 :デフォルトの名無しさん:2011/11/10(木) 13:51:48.52
中途半端って、当たり前やん
もともと private と public しかなく、後付けで追加したトリビアなんだから

80 :デフォルトの名無しさん:2011/11/10(木) 14:16:34.87
サブクラスには公開したいがサブサブクラスには見せたくない
でも継承をサブクラスに限定するノーコストの方法も無い
よってprotectedはゴミ

81 :デフォルトの名無しさん:2011/11/10(木) 14:18:46.97
protectedはどうしてもそれしか方法が無いときに
仕方なく使うもの。汚いことを自覚した上で。

82 :デフォルトの名無しさん:2011/11/10(木) 14:31:16.80
他に書き方があるからどうしてもっていうケースは存在しない
よってprotectedは生ゴミ


83 :デフォルトの名無しさん:2011/11/10(木) 15:27:21.24
>>82
まあそうなんだけど、大人の事情でって事あるじゃん

84 :デフォルトの名無しさん:2011/11/10(木) 16:51:43.31
頭隠して尻隠さずとでも言うところか

85 :デフォルトの名無しさん:2011/11/10(木) 17:37:38.18
protectedデストラクタは必要だろ

86 :デフォルトの名無しさん:2011/11/10(木) 17:39:30.31
継承の話だろカス

87 :デフォルトの名無しさん:2011/11/10(木) 17:40:12.71
>>85
>>74-75

88 :デフォルトの名無しさん:2011/11/10(木) 17:44:06.95
protectedデストラクタ厨必死だなww

89 :デフォルトの名無しさん:2011/11/10(木) 19:50:26.59
>>66
protectedメンバをprotectedメンバのままにしておきたい場合に
protected継承する事になる、ということ
private継承すると、protectedメンバをprotectedメンバのままにするには
protectedなとこで全部usingしないといけなくなる

90 :デフォルトの名無しさん:2011/11/10(木) 20:05:20.15
はいはい

91 :デフォルトの名無しさん:2011/11/10(木) 21:07:08.16
ばぶー

92 :デフォルトの名無しさん:2011/11/10(木) 23:53:35.57
>>78
public にすれば機能が不明確になったり、必要でもないのに無理やり使わされたりするような
言い方だけど、そんなことはないよね。

93 :デフォルトの名無しさん:2011/11/11(金) 00:13:50.03
>>77
そのネタは通じなかったみたいだな

94 :デフォルトの名無しさん:2011/11/11(金) 00:29:47.00
>>77
乙女心は難しいよな

95 :デフォルトの名無しさん:2011/11/11(金) 00:35:47.41
>>77
財産は子供にだけ渡したい。
私の財産はみんなの共有物じゃない。

中途半端?
継承なんだから、親子関係と強欲具合で考えればいいんだよ


96 :デフォルトの名無しさん:2011/11/11(金) 00:40:12.46
>>95
知らない誰かがいくつでも勝手に追加するものを「子供」だなどと考えるのは無理があるだろう。

97 :デフォルトの名無しさん:2011/11/11(金) 01:05:29.24
>>96
ファイルスコープ限定して子の制約は出来るが。
尤も。protectedの用途(protected継承に限らず)は、
子に抽象化関数を実装することを義務付けた上で
機能提供することだろうがな。

98 :デフォルトの名無しさん:2011/11/11(金) 01:07:46.81
ラララララーラララーララ・・・

99 :デフォルトの名無しさん:2011/11/11(金) 01:09:07.16
>>97
ファイルスコープ内を信用するなら public でもいいじゃん。

100 :デフォルトの名無しさん:2011/11/11(金) 09:14:19.38
protectedよりfriendの方がましだわ
子には公開できて孫には公開しないとか簡単にできるし
protectedでは簡単に間違いが起こってしまう

101 :デフォルトの名無しさん:2011/11/11(金) 13:21:00.13
子作りするときだけ公開するところ

102 :デフォルトの名無しさん:2011/11/11(金) 14:29:00.39
friendはゴミ

103 :片山博文MZ ◆0lBZNi.Q7evd :2011/11/11(金) 16:15:13.72
>>102
友達できないタイプですね。
みんな友達になればアクセスが簡単。冗談だけど。

104 :デフォルトの名無しさん:2011/11/11(金) 16:29:07.03
('ω`)…

105 :デフォルトの名無しさん:2011/11/11(金) 19:32:10.07
template <class F> class SystemForF
{
friend class F;
void DangerousMethod(void);
};

class Hoge : SystemForF<Hoge>
{
public:
void Func(void) { ...; DangerounsMethod(); ...; }
};

//Good!


template <class F> class SystemForF
{
protected:
void DangerousMethod(void);
};

class Hoge : SystemForF<Hoge> { ...; };

class ViciousClass : SystemForF<ViciousClass>
{
public:
SystemForF<ViciousClass>::DangerousMethod;
};

// Oh my god!!



106 :デフォルトの名無しさん:2011/11/11(金) 21:28:32.42
親クラスに付けるprotectedはともかく、
メンバーに付けるprotectedは、親クラスじゃなく
子クラスを守るための物だろ。
子が生成したバッファを親に参照させるとかの用途には
friendじゃ代用品にならない。

107 :デフォルトの名無しさん:2011/11/11(金) 21:32:12.81
protected厨はほんとにしつこいな

108 :デフォルトの名無しさん:2011/11/11(金) 21:53:14.61
class Derived:public Base
{
      Channel channel;
public:
      Derived()
      {
           Bind( &channe l);
      }
};
Channel channel;
Derived object;
object.Bind( &channel ); //エラー

friendで似たことすると、
Channel channel;
Derived object;
Bind( &object, &channel ); //コンパイルが通ってアウト

そもそも用途が違う。どちらかが代用になるもんじゃない。

109 :デフォルトの名無しさん:2011/11/11(金) 21:59:28.35
コンパイルが通るように書くからだろアホ

110 :デフォルトの名無しさん:2011/11/11(金) 22:01:02.20
friendでコンパイル通らないように同じ事を書いてみろよ

111 :デフォルトの名無しさん:2011/11/11(金) 22:06:38.70
class Base
{
friend class Derived;
private:
void Bind(C * c);
};
class Derived: private Base
{
C c;
public:
Derived() { Bind(&c); }
};


112 :デフォルトの名無しさん:2011/11/11(金) 22:08:29.14
>>111
子クラス制限してどうすんだよw
親を守ることが目的じゃないんぞ

113 :デフォルトの名無しさん:2011/11/11(金) 22:11:35.76
template <class Derived> class Base
{
friend class Derived;
void Bind(X & x);
};

class Derived: Base<Derived>
{
X x;
public:
Derived(void) { Bind(&x); }
};

これで親も子も完全に守られてるのでprotectedの出番はない

114 :デフォルトの名無しさん:2011/11/11(金) 22:11:50.18
>>111
Socket, File, Pipe, Mail, 派生が出来るたびに追加すんのかい
派生クラスがいくら出来ても問題ないのに

115 :デフォルトの名無しさん:2011/11/11(金) 22:14:31.91
>>113
Base同士の互換性がなくなるな

116 :デフォルトの名無しさん:2011/11/11(金) 22:14:35.18
>>114
>>113

117 :デフォルトの名無しさん:2011/11/11(金) 22:19:35.82
class Base {
protected:
void Bind(C * pC);
};

class Derived: public Base {
C c;
public:
Derived(void) { Bind(&c); }
};

class Unko: public Base {
public:
static void Bind(Base & b, C * pC) { b.Bind(pC); }
};

Derived d;
C c;
Unko::Bind(d, &c);

あーあ、protected厨のせいで大事故だよ
friendにしとけばこんなことはなかったのにな

118 :デフォルトの名無しさん:2011/11/11(金) 22:19:59.05
>>113
バイナリ肥大するだけじゃん
friendに拘って何がしたいの?

119 :デフォルトの名無しさん:2011/11/11(金) 22:22:25.26
>>117
子が守られようとしてるのに、何で子に自殺させてんの?バカなの?

120 :デフォルトの名無しさん:2011/11/11(金) 22:25:33.04
>>119
わかってねーな
自殺させちゃうカスグラマがどこに潜んでるかわからねーのが現場の怖いところだろうが
とにかくまずい事は簡単にはデキないようにすることが至上命令だ

121 :デフォルトの名無しさん:2011/11/11(金) 22:26:00.03
Unkoを書いたヤツがバカなだけなのにな

122 :デフォルトの名無しさん:2011/11/11(金) 22:27:41.70
>>120
困るのはUnkoなだけで、
他は困らんから大した問題じゃない。

123 :デフォルトの名無しさん:2011/11/11(金) 22:30:37.56
class Unko: public Derived
{
C c;
public:
Unko(void){ Bind(&c); }
};

どうすんだこれprotectedとか危険過ぎる

124 :デフォルトの名無しさん:2011/11/11(金) 22:34:49.63
Unkoは解っててやってんだろ

125 :デフォルトの名無しさん:2011/11/11(金) 22:37:19.85
いやわかってねえよwww
ベースを根元まで熟知してないと安全に継承できないとかどんだけ馬鹿な設計なんだよ

126 :デフォルトの名無しさん:2011/11/11(金) 22:41:36.92
バカを救う必要はない

127 :デフォルトの名無しさん:2011/11/11(金) 22:43:56.82
だな
protectedなんて使うバカは放置が最善策だわ

128 :デフォルトの名無しさん:2011/11/11(金) 22:45:12.25
自分が使えないからってprotectedの存在を拒否しなくてもいいのよ

129 :デフォルトの名無しさん:2011/11/11(金) 22:45:15.58
派生先からアクセスできなくすることもできるが。

class Derived:public Base
{
      Channel channel;
      Base::Bind;
public:
      Derived()
      {
           Bind( &channe l);
      }
};

130 :デフォルトの名無しさん:2011/11/11(金) 23:06:42.03
friend厨沈黙
詰んだな

131 :デフォルトの名無しさん:2011/11/11(金) 23:16:47.29
>>129
>>117に対処できない半端な対応
friendには1歩及ばないな

132 :デフォルトの名無しさん:2011/11/11(金) 23:21:54.95
>>131
Unkoからアクセスできなくなるわけだけど、言語仕様解ってんの?

133 :デフォルトの名無しさん:2011/11/11(金) 23:26:02.15
>>132
適当なこと言うな

134 :デフォルトの名無しさん:2011/11/11(金) 23:36:57.38
信じられないなら手元のコンパイラでコンパイルしてみたら?

135 :デフォルトの名無しさん:2011/11/11(金) 23:43:48.77
参りました
これからはprotectedを使いまくります
protected最高ですね
protectedのない生活は今後考えられません
protectedを使わない奴は情弱ですね

136 :デフォルトの名無しさん:2011/11/11(金) 23:47:18.14
誰も全てにprotected使えとは言ってないんだがねぇ
方法はいくつもあるのにシンプルに済むことを
ひとつの方法に拘って複雑にしなけりゃいい

137 :デフォルトの名無しさん:2011/11/12(土) 04:56:57.68
顔の赤さに免じて許してやれよ

138 :デフォルトの名無しさん:2011/11/12(土) 09:27:49.77
-std=c++0xを指定した状態で

char* s;
s = {1,2,3,4}

が、エラー: assigning to an array from an initializer list になるのですが
以前のバージョンだと出ませんでした。
仕様が変わったのでしょうか





139 :デフォルトの名無しさん:2011/11/12(土) 09:57:16.49
左様

140 :デフォルトの名無しさん:2011/11/12(土) 12:23:20.07
ありがとうございます。
似たような表記で書くにはどうすればいいですか?


141 :デフォルトの名無しさん:2011/11/12(土) 12:48:44.36
std::initializer_list<char> a;
a = { 1, 2, 3 };

142 :デフォルトの名無しさん:2011/11/12(土) 12:48:54.72
char *s = {'\1', '\2', '\3', '\4'};

143 :デフォルトの名無しさん:2011/11/12(土) 13:00:45.74
char *s = "\x1\x2\x3\x4";

144 :デフォルトの名無しさん:2011/11/12(土) 13:03:01.81
文字列、配列リテラルを初期値とするポインタの宣言const付いてないとエラーにして欲しい

145 :デフォルトの名無しさん:2011/11/12(土) 18:09:26.37
gccは以前から警告
VCは提案却下

146 :デフォルトの名無しさん:2011/11/12(土) 18:33:38.94
配列リテラルを初期値とするポインタの宣言なんて規格違反だぞ
文字列はできてたけどC++11で禁止された

147 :デフォルトの名無しさん:2011/11/12(土) 20:39:39.30
教えて下さい

関数内で作られる、無名一時オブジェクトはどのメモリ領域に格納されるんでしょうか?
スタック、ヒープ/フリーストア、静的領域?

つまるところ、↓の f() と g() では、どっちが速いんでしょうか?

ttp://ideone.com/PJ75c

148 :デフォルトの名無しさん:2011/11/12(土) 20:42:54.25
>>147
実装依存だがどちらもスタックになるだろう。
その前になぜ自分で測定しない?

149 :デフォルトの名無しさん:2011/11/12(土) 20:43:59.82
スタック

150 :デフォルトの名無しさん:2011/11/12(土) 20:47:56.91
>>147
無名オブジェクトはスタックに作られる。
同じか、fがムーブ可能な場合速くなる可能性がある

151 :デフォルトの名無しさん:2011/11/12(土) 20:51:26.80
テンポラリを直接放り込んだほうが最適化しやすいし早くなるよ


152 :デフォルトの名無しさん:2011/11/12(土) 21:10:36.69
>>147
そのコードだと完全にコンパイラ次第。
同じコンパイル単位にある関数はinline指定子の有無を無視して
インライン展開するコンパイラが多い。

153 :デフォルトの名無しさん:2011/11/12(土) 21:16:39.50
>>147
gでXをstatic constしといたらもっと早いんじゃね?とか思ったけどどうなんだろ

154 :デフォルトの名無しさん:2011/11/12(土) 22:01:28.16
さあ

155 :デフォルトの名無しさん:2011/11/12(土) 22:09:38.52
飲み込んでくれィ

156 :147:2011/11/12(土) 22:13:49.42
スタックに積まれるんですね

>>150
確かに、ムーブを考えると無名一時オブジェクトの方が、速くなる可能性がありますね
盲点でした

コンパイラの最適化と、ムーブに期待して、無名一時オブジェクトで書くことにします
皆さん、アドバイスありがとうございました

157 :デフォルトの名無しさん:2011/11/12(土) 22:14:27.39
うむ、下がってよし

158 :デフォルトの名無しさん:2011/11/12(土) 22:23:20.31
期待するとかじゃなく、スタックトレースとかアセンブリみて確認しとけよ

159 :デフォルトの名無しさん:2011/11/12(土) 22:27:18.96
そんなもん見たって環境代わったら同じにはならない
大まかな傾向だけ理解して書ける方が偉いわ

160 :デフォルトの名無しさん:2011/11/12(土) 22:42:36.42
マシン語くらい使えろよ、頼むから

161 :デフォルトの名無しさん:2011/11/12(土) 22:45:47.83
お前の頼み聞いて得することなんて一つもないしなぁ

162 :デフォルトの名無しさん:2011/11/12(土) 22:46:03.16
大まかな傾向を理解するために、実際の動作をしらべるんだろ。
理屈上そうなるから多分そうなるだろうじゃ根拠が薄いだろ。

163 :デフォルトの名無しさん:2011/11/12(土) 23:28:01.59
あほか。C++のコードを実験で理解するな。
あくまで規格表に従えよ。

でないとVCみたいなクソコンパイラのクソ独自仕様に惑わされて
可搬性のない(次のアップデートで反故にされかねない)クソコードを量産する
クソプログラマになっちまうぞ、クソ。っていうかクソVCをクソ捨てればクソ済むんだけどね/(^o^)\

164 :デフォルトの名無しさん:2011/11/12(土) 23:32:25.25
クソクソうるせーよクソ野郎

165 :デフォルトの名無しさん:2011/11/12(土) 23:40:59.79
あくまで規格票に従えよクソ

実験で何を調べようとしているのかの論点も違っていそうだな
本番ではなく「実験」では規格合致度に重きをおく

合致度の低いコンパイラや、合致度はそこそこでも現にバグを見つけたりしたとき
クソっていう対象がコンパイラな単純低次元はどっかいけ
目の前の現実への自分の対応をクソと謙虚に自省する人には助太刀いたすかって気にはなる

166 :デフォルトの名無しさん:2011/11/12(土) 23:56:25.79
最適化はコンパイラの裁量だから、
コンパイラの動作を観察するしかねぇだろボケ

167 :デフォルトの名無しさん:2011/11/13(日) 00:12:09.68
ご機嫌ななめってるときにピエロしか選択肢はないと割り切るポリシーだな

168 :デフォルトの名無しさん:2011/11/13(日) 00:29:52.34
VCは糞だろ。

169 :デフォルトの名無しさん:2011/11/13(日) 01:03:35.76
で、オススメのコンパイラはどれなんだ?

170 :デフォルトの名無しさん:2011/11/13(日) 01:04:54.55
clang++

171 :デフォルトの名無しさん:2011/11/13(日) 01:43:51.90
VCがクソならおまえらでVCを超えるコンパイラ作ってくれ

172 :デフォルトの名無しさん:2011/11/13(日) 02:17:20.69
俺gccのコミッターだからキリッ

173 :デフォルトの名無しさん:2011/11/13(日) 03:42:53.05
最適化がされるか否かはコンパイラによって違うだろうが、
そのコードが最適化され易いかどうかは共通だぞ

174 :デフォルトの名無しさん:2011/11/13(日) 07:04:48.48
>>168
mfcが糞で、c++11に準拠する気がまるで無いだけで、コンパイラとしては速いコード吐く方




175 :デフォルトの名無しさん:2011/11/13(日) 11:04:12.44
未だにMFCで新規開発してるところってあるんかね。
Qt触るとMFCが汚物過ぎて受け付けん。

176 :デフォルトの名無しさん:2011/11/13(日) 11:21:03.59
MFCは設計が古いからだろうね。
マイクロソフトがまだテンプレートにもダイナミックキャストにも
否定的だった時代に作られたものらしいし。

177 :デフォルトの名無しさん:2011/11/13(日) 11:42:03.36
古いプロジェクトを継続してるところは使ってたりする

178 :デフォルトの名無しさん:2011/11/13(日) 15:32:48.49
MFCはしょうがないじゃん。Win32の薄いラッパーでしかないから。

179 :デフォルトの名無しさん:2011/11/13(日) 15:46:00.90
COM統合してることを考えると薄いラッパーとは言えないのでは。
薄いどころかがっつりフレームワークだと思うけど。

180 :デフォルトの名無しさん:2011/11/13(日) 15:52:01.24
VS2010で、MFCプロジェクト作ってビルドしてみたらすごいことになってた。
MSはまだやる気まんまんじゃないか。

181 :デフォルトの名無しさん:2011/11/13(日) 16:22:46.42
WTLとは何だったのか

182 :デフォルトの名無しさん:2011/11/13(日) 16:32:00.37
便利だよね

183 :デフォルトの名無しさん:2011/11/13(日) 16:57:00.85
>>179
ロクな枠組みが無いんだからフレームワークは言い過ぎ。
あくまでC++用ラッパーの域は出ないよ。

184 :デフォルトの名無しさん:2011/11/13(日) 21:57:28.34
超初心者ですみません
vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか

185 :デフォルトの名無しさん:2011/11/13(日) 21:58:13.23
Win32 VCL WTL wxWidget Qt WinForms WPF Swing AWT
これらは使い方が分かるんだけど
MFCだけわけがわからない

186 :デフォルトの名無しさん:2011/11/13(日) 22:06:28.67
>>184
ヘッダファイルじゃなくてライブラリのディレクトリパスを指定する

187 :デフォルトの名無しさん:2011/11/13(日) 22:06:42.39
>>185
これ読めば、大分分かるようになる

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング
http://www.amazon.co.jp/gp/product/4881357042


188 :デフォルトの名無しさん:2011/11/13(日) 22:10:06.49
>>186
ありがとうございます。
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。

189 :デフォルトの名無しさん:2011/11/13(日) 22:10:57.61
ここで聞け
【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/

190 :デフォルトの名無しさん:2011/11/13(日) 22:18:07.28
>>189
すみません
ではそちらで質問させて頂きます

191 :デフォルトの名無しさん:2011/11/13(日) 22:43:09.25
>>188
ライブラリを使いたい時に使う、としか
DXライブラリでも使ってみれば?

192 :デフォルトの名無しさん:2011/11/13(日) 22:50:05.42
>>188
コンパイルとリンクの区別がつかないと理解できないかもね
ヘッダーファイルはコンパイル時に必要になるもの。
ライブラリはリンク時に必要になるもの。

ヘッダーは宣言が書いてあり(そうとは限らないが)、ライブラリーにはその実装が記述されてる。
ヘッダーとライブラリーは直接関連付けられているものじゃないから、
どちらか片方指定したからといって、もう一方が自動で取り込まれることはない。

193 :デフォルトの名無しさん:2011/11/14(月) 00:15:18.58
>>187
その本昔持ってた
古い本だしもうMFCは使わんと思って
処分してしまったわ

194 :デフォルトの名無しさん:2011/11/14(月) 01:14:02.79
こういう話って厳密に言えば言語の話じゃないんだよな…
土台のシステムとやり取りする実行時環境とかリンカとかローダとかの
話を昔の人はわかってたから話省略してるんだけどこのへんの知識がないと
コンパイルエラーを潰すことは絶対にできない。多重定義とかそのへんのやつね。

自分もC++いじり始めた時スゲー苦労した。基本的にC++本に書いてないんだもの…

195 :デフォルトの名無しさん:2011/11/14(月) 04:59:44.72
weak_ptr<Hoge> 型のメンバ変数に対するアクセッサを定義するばあい、
セッターの引数の型とゲッターの戻り値の型は何にすればいい?

現状、メンバ変数が shared_ptr であっても weak_ptr であっても
const shared_ptr<Hoge> & 型の引数を持つセッターで設定、
shared_ptr<Hoge> 型の戻り値で取得できるようにしている(this->pHoge.lock() を返している)んだけど、これってアリかな?

196 :デフォルトの名無しさん:2011/11/14(月) 05:43:53.92
>>195
「メンバ変数に対するアクセッサ」なんて考えるんじゃなくて、
使う側から見て自然で使いやすいインターフェースを考えるんだ。

普通は weak_ptr を持つかどうかを使う側に意識させないほうが
いいんじゃないかな?

197 :デフォルトの名無しさん:2011/11/14(月) 08:42:11.84
>>195
shared_ptrは所有物を返すために使い、
weak_ptrは参照するために使う。

値を返すのにweakは無いと思う。
有効かどうか解らない戻り値を
そこらじゅうでチェックすんのも効率悪いし。

198 :デフォルトの名無しさん:2011/11/14(月) 09:38:05.95
アクセッサの時点で負けだから設計からやり直しに決まってんだろ

199 :デフォルトの名無しさん:2011/11/14(月) 10:02:54.72
>>195
うーん無いと思いますね…。
shared_ptrを返しますが、それは有効かもしれないし無効かもしれません。
十分注意してチェックして使ってくださいね。ってことになるでせふ。
それならそのままweak_ptrを返すほうがまだミスの恐れがなくていいと思うのだけど。

200 :195:2011/11/14(月) 12:28:24.78
うーん、具体例を挙げます

class HogeContainer
 : public enable_shared_from_this(HogeContainer) {
public:
 void AddElement(const shared_ptr<Hpge> & p) {
  p->SetOwner(shared_from_this());
  hoges.push_back(p);
 }
 void RemoveElement(const shared_ptr<Hpge> & p);
private:
 list<shared_ptr<Hpge>> hoges;
};

class Hoge {
 friend HogeContainer;
public:
 A GetOwner();
private:
 void SetOwner(@);
 weak_ptr<HogeContainer> pOwner;
};

このばあいの@・Aの型は何がよいのだろうか
但し、Aの戻り値からshared_ptrを取得できることが条件

201 :デフォルトの名無しさん:2011/11/14(月) 12:43:27.95
寿命の関係や返り値で得たポインタを他のクラスに所有されても良いのかダメなのかによって異なる

202 :195:2011/11/14(月) 23:14:19.76
>>201
Aの戻り値から得たshared_ptrをどこかで長期的に保存(共有)しても構わない
どのみち、weak_ptrを返してもそれを制限する術は無いだろうし

203 :デフォルトの名無しさん:2011/11/14(月) 23:19:56.99
>>202
あんた自身の意見がよくわからん。
shared_ptr を返すことで何か不満なのか?

204 :195:2011/11/15(火) 00:18:39.79
>>203
shared_ptrを返す自分のコードに賛成できないというレスがあるので、
というか設計が間違っているという意見あるので、そういった意見の内容を知りたいです。

205 :デフォルトの名無しさん:2011/11/15(火) 00:38:13.43
>>204
どこのスレから来たの?

206 :デフォルトの名無しさん:2011/11/15(火) 00:44:09.06
>>204
shared_ptr に問題があるとしているのは >199 だけだな。
ヌルを返したくないなら例外投げるなりすればチェック漏れも無いんだから、
あんまり有用な意見だとは思わないね。

設計が〜っていうのは、先に実装ありきでインターフェースを後から考えてるのが
ダメっていう一般的な話。具体的なコードを指して言ってるんじゃない。たぶん。

207 :デフォルトの名無しさん:2011/11/15(火) 02:01:09.51
説明用のサンプルコードに突っ込みいれるのもなんだけど>>200を見る限りでは設計見直せと言いたくなるな。

・HogeContainerはshared_ptrを介してHogeを所有してるがそれは他の何かにもHogeの所有(共有)を許すということだ。
とすると複数のHogeContainerが単一のHogeを所有することもありえるがHogeのOwnerには一つしかなれない。

・そもそもHogeからHogeを所有してるHogeContainerが直接わかる事に意味はあるのか?
HogeContainerからHogeを解放したいとかの用途ならHogeに専用の関数を個別に用意すべきではないか?

208 :デフォルトの名無しさん:2011/11/15(火) 02:23:46.06
ほげほげうるさいわ

209 :195:2011/11/15(火) 02:42:46.47
>>207
>・HogeContainerはshared_ptrを介してHogeを所有してるが、(ry
 いや、それは当然のごとくHogeContainer.RemoveElement(...)とHoge.SetOwner(...)内の処理で調整するだろ
 void SetOwner(pNewOwner) {
  if (NULL != this->pOwner) {
   this->pOwner->RemoveElement(this);
  }
  this->pOwner = pNewOwner;
 }
 的な感じで。

>・そもそもHogeからHogeを所有してる(ry
 ツリー構造でノードが持つGetParent()に意味は無いのかと問いたい

210 :デフォルトの名無しさん:2011/11/15(火) 05:45:16.78
まあがんばれ

211 :デフォルトの名無しさん:2011/11/15(火) 08:30:09.48
勝手に離脱するギミックは最初はクールに見えるが後で面倒が多いことに気がつく
イテレータ回してるときに抜けられるとコンテナの種類によってはバグになるし
生存フラグを使う方法のほうがいいよ。ダサイけど

212 :デフォルトの名無しさん:2011/11/15(火) 08:56:50.10
> ツリー構造でノードが持つGetParent()に意味は無いのかと問いたい
それは個々の要素自体がコンテナの管理者でもある場合で要素と要素の管理者が異なる場合とは違う。
STLコンテナだとイテレータから前後の要素はわかってもコンテナ自体はわからないだろ。

213 :195:2011/11/15(火) 09:46:46.27
>>211
そこら辺は要考慮だが、イテレータを使用している最中にコンテナの要素を削除して問題あるのはvectorぐらいだし、
そもそもフラグを使用しても今度はいつコンテナから要素を削除するのか問題になる

>>212
要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
前者は、例えばC#の話になるが、DataTableクラスはDataSetプロパティ(属するDataSet、つまりは親を取得する)がある訳で
後者は自分の例でのHogeクラスを削除して、HogeContainerクラスに置き換えたものになる

だがちょっと待ってほしい。自分が質問した内容は>>200な訳で、
@ = const shared_ptr<Hoge> &
A = shared_ptr<Hoge>
は問題ないということで宜しいか?

214 :デフォルトの名無しさん:2011/11/15(火) 09:56:16.53
>>213
ぶっちゃけそんな細かいところどうでもいいから好きにすればいいよ

215 :デフォルトの名無しさん:2011/11/15(火) 10:37:22.61
本筋と違うと話だというならそれはそれで

> 要素!=要素の管理者であっても、違っていても、どちらも親(管理者)が欲しい時はあるんじゃないか?
そういう時があることは否定はしない。
しかしコンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
 container c;
 fuga(c.firstnode());
みたいな時にfugaにコンテナを操作する権利(コンテナそのものや他の要素の削除なんかも自由自在)を
与えることになり得る設計は一般的にあまり望ましくないだろう。

216 :デフォルトの名無しさん:2011/11/15(火) 10:48:15.64
他のオブジェクトが所有しているオブジェクトを取得して、
それに対してアレコレするってダサいと思う

217 :デフォルトの名無しさん:2011/11/15(火) 10:56:09.69
ファクトリーパターンのこと?

218 :デフォルトの名無しさん:2011/11/15(火) 11:17:39.88
>>217
違うと思うな

219 :195:2011/11/15(火) 11:43:14.12
>>215
> コンテナ自体(管理者)を操作(コンテナから要素の値のコピーや参照を取得)する権利があるものと
取得した値を利用するだけの権利しかないものとをはっきり分離して使い分けたほうが良いときも多い。
そこら辺は使い分ける。問題ない
>>200の、本筋の質問のための例では非constではないOwnerへの参照を取得できるようになっているだけだ

>>216
その説明だと"ダサい"に当てはまる範囲が大きすぎね?

220 :デフォルトの名無しさん:2011/11/15(火) 11:55:30.03
あー、確かに広すぎた。

221 :片山博文MZ:2011/11/15(火) 13:29:45.45
ふふふ、諸君はわたくしに勝てるかな。。。

222 :デフォルトの名無しさん:2011/11/15(火) 16:21:07.57
ダサいちゅーか基本として内部データ見せちゃだめだわな。

223 :デフォルトの名無しさん:2011/11/15(火) 17:45:23.69
コンテナなのに内部データ見せないで何するんだよカスwww

224 :デフォルトの名無しさん:2011/11/15(火) 18:02:28.65
そもそも何で今更オレオレコンテナを作ろうとしてんのさ

225 :デフォルトの名無しさん:2011/11/15(火) 18:04:10.17
タスクシステムです

226 :デフォルトの名無しさん:2011/11/15(火) 18:28:11.47
>200のコードはあくまでも説明のためのサンプルだよね?
実際に使うのがあの設計だったらいくらなんでも拙いだろ

227 :デフォルトの名無しさん:2011/11/15(火) 18:29:56.32
じゃあお前らだったらどうするの?

228 :デフォルトの名無しさん:2011/11/15(火) 18:37:04.83
C++で動的確保した配列を解放する場合って、

delete [] test;

って書き方でいいですよね?
このtestっていうのは、あるクラスを動的確保した配列名なんですが、間違ってますか?

もしかして自分で作ったクラスはこの解放の仕方使えないとかですか?
リークしてるのは、crtdbg使って調べました

229 :デフォルトの名無しさん:2011/11/15(火) 18:40:41.27
主はvectorを使いなさいとおっしゃった


230 :デフォルトの名無しさん:2011/11/15(火) 18:40:43.72
ちゃは☆
このクラスをラップしてるクラスを解放してませんでした☆
忘れてください☆

231 :デフォルトの名無しさん:2011/11/15(火) 20:05:57.15
>>228
これみて思い出した。
GCCで明示的にデストラクタを呼び出したオブジェクトに
再度アクセスしたら落ちた。
デストラクタでメモリー解放とかしてなかったんだけど
なんで落ちたかな。
昔の事なんで状況をはっきり思い出せん。

232 :デフォルトの名無しさん:2011/11/15(火) 21:22:08.73
ここで聞いていいか分からないんですが、質問させて下さい。
VC++2010か2008のソリューションファイルやプロジェクトファイルごと
誰かに配布した場合、そのファイルからユーザ名とかがばれる可能性ってありますか?

233 :デフォルトの名無しさん:2011/11/15(火) 21:32:51.03
プロジェクトのpathにユーザー名等があれば、笑われるだろうな。

234 :デフォルトの名無しさん:2011/11/15(火) 22:00:17.97
実行可能ファイルにもユーザー名入ってるから気にすんな

235 :デフォルトの名無しさん:2011/11/15(火) 22:27:18.87
>>234
試しにexeの中サーチしてみたけど入ってないみたいだけど?

236 :デフォルトの名無しさん:2011/11/16(水) 00:13:40.99
デバッグビルドならありうる

237 :デフォルトの名無しさん:2011/11/16(水) 00:29:18.57
>>232
>>235-236
http://2chnull.info/r/tech/1303092297/831-845

238 :デフォルトの名無しさん:2011/11/16(水) 00:54:35.52
>>225
いまだにそんな珍妙なもん作ろうとしてるやつがいるのか。驚きだわ。

239 :デフォルトの名無しさん:2011/11/16(水) 01:02:11.35
誘導されてきました。

質問です。

以下のようなコードを書きました。。 
ttp://ideone.com/n4aAH 

ランダム内容のファイルを吐くだけのコードです。
これの乱数の初期化コードにstdlibの乱数をつかっているのですが、今風だとどういう初期化がいいんでしょうか。

このようにしたのは、ある程度乱数をコントロールして吐かせたいと思ったからですが、今時stdlibの乱数を使うのは無いだろうとおもったんです。

どう修正すればいいかお知恵をお貸しください。
あと、なぜそうなのかをご教示くだされば幸いです。

240 :239:2011/11/16(水) 01:04:38.55
末尾に空白が入ってしまいました。
ttp://ideone.com/n4aAH


241 :デフォルトの名無しさん:2011/11/16(水) 01:11:11.01
別に修正する必要無いね。

242 :239:2011/11/16(水) 01:12:50.43
>>241
なぜですか?

243 :デフォルトの名無しさん:2011/11/16(水) 01:16:56.88
>>242
rand は今でも変わらず動くし、同じ動作をする新しいインターフェースは用意されていないから。

244 :デフォルトの名無しさん:2011/11/16(水) 01:21:17.71
>>243
線形合同法などは色々不具合が指摘されていますが、
乱数を初期化するための乱数としては問題ないという判断ですか?

245 :デフォルトの名無しさん:2011/11/16(水) 01:32:23.23
>>244
判断っていうか、実際に使う乱数は MT から取り出してるんだから
線形合同法の問題は関係無いでしょ。

そういう意味では seed_seq の生成にわざわざ rand を使っている意味も不明。
std::vector<uint_least32_t> Seeds(1, 0) で初期化するのと意味的に同じじゃない?

246 :デフォルトの名無しさん:2011/11/16(水) 01:38:12.30
>>245
ある程度の質を壊さず、1変数で多様でランダムな内容を吐きたかったのですが、
同じ数字の羅列で初期化しても、質を壊さないで乱数が取れるのでしょうか?
それならそれで非常に助かるのですけど。

MT自体を本格的に触ったのが今日はじめてなので感覚がつかめてないのです。

247 :デフォルトの名無しさん:2011/11/16(水) 01:38:53.60
外部からSeedわたす意味がなくなってるな

248 :デフォルトの名無しさん:2011/11/16(水) 01:46:11.70
>>247
それはstdlibのrand()を使うことに対してですか?

249 :デフォルトの名無しさん:2011/11/16(水) 02:01:14.91
>>246
試せよ。

seed_seq を使えば適当にビットを引っ掻き回した値で初期化されるから、
与えた初期値から想像できるような単純な結果にはならないはず。
http://msdn.microsoft.com/ja-jp/library/ee462311.aspx

250 :デフォルトの名無しさん:2011/11/16(水) 02:21:32.40
>>249
シード生成用なのか、なんか色々やってますね。ふむふむ。
って、ん・・・??
for (k = 0; k < n; ++k) first[k] = 0x8b8b8b8b
これをやってるっていうことは、初期値がどのような値にもかかわらず、
定数で初期化されて、ランダム要因は配列の長さだけになってる気がします。

ちゃんと読めてないけど、割りと納得できました。
杞憂だったんだと思って割りきってみます。

回答者の方。非常に勉強になりました。
ありがとうございました!!
失礼します。

251 :デフォルトの名無しさん:2011/11/16(水) 03:13:20.53
スターどっきりかよ

252 :デフォルトの名無しさん:2011/11/16(水) 03:23:56.57
どこにスターがいたのかと・・・。

253 :デフォルトの名無しさん:2011/11/16(水) 04:30:04.35
boostのメルセンヌツイスターでも使っとけよ
エラーが出てるのは使い方が間違ってるぞ

それかン簡単に済ませたいのならアルゴリズム辞典の乱数の改良とか

http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/

の中の

algo.lzhをDLし、中のimprove.cを使うとか、整数の一様乱数
whrnd.cとかkrnd.cとか

254 :デフォルトの名無しさん:2011/11/16(水) 04:45:04.34
>>253
奥村の人か。この人のアルゴリズム本持ってる!!でも、読み解けては無い!
まー、それはいいとして。

>>240 のコードはVC10EEでは普通に実行できるのよ。
MSのことだから、何かがズレてるのだろうけど。
で、自分はMS環境だから自分の用事は済んだんだ。

でも、紹介してくれてありがとう!!ちょっと読んでみるよ。

255 :254==239:2011/11/16(水) 04:57:22.52
奥村の人のコードは紹介してもらったやつを見た限りだと、
ちゃんと区切りがあってC++のクラス化しやすそうだ。

乱数をクラスにするとすごい便利なんだよな。ゲームとかゲームとかゲームとか。

今日はもう寝るので明日余裕があったらもうちょっと読んでみます。。

256 :デフォルトの名無しさん:2011/11/16(水) 06:17:57.70
ideone.comは一部のboostにしか対応してないからな
コンパイルエラーになったんだろ

257 :デフォルトの名無しさん:2011/11/16(水) 11:39:44.29
クラスの共通設定をファイルから読み込む場合にファイル名って決め打ちにしますか?

class Hoge {
static bool initialized;
static CommonData commonData;
static void Load(void) {
if(initialized) return;
file f("Hoge.dat"); // 〜
if(succeeded) initialized = true;
else throw except("init error");
}
public:
Hoge(void) { Load(); }
};

class Fuga {
static bool initialized;
static CommonData cd;
public:
static bool Load(file & f) {
// 〜
if(succeeded) initialized;
return succeeded;
}
};

Fuga(void) { if(!initialized) throw except("not ready"); } };

Hogeの方は初期化の面倒さや初期化忘れもありませんが、ファイル名が競合するかもしれないという不安があります
面倒な部分がカプセル化されててOOPっぽい雰囲気もあります
Fugaの方は初期化忘れや初期化順の混乱とかがおこるかもしれませんが、ファイル名はアプリケーションで指定できるので競合しません
どっちがいいんでしょうか

258 :デフォルトの名無しさn:2011/11/16(水) 15:56:36.13
クラス Hoge のオブジェクトの生成はいつか。グローバル ?
Fuga::Load() をいつ呼び出すのか ?
そもそも、Hoge と Fuga には「ファイル名を内側で用意する/外から与える」のほかにも
差があるよん。

259 :デフォルトの名無しさん:2011/11/16(水) 19:30:32.47
そもそも、設定なんかをグローバルで共有したりなんかしない。

260 :デフォルトの名無しさん:2011/11/16(水) 19:34:43.37
またその話か

261 :デフォルトの名無しさん:2011/11/16(水) 19:54:35.74
>>259
幼稚園からやり直せ

262 :デフォルトの名無しさん:2011/11/16(水) 19:58:36.91
>>261
I/Oや副作用中心なわけでもなく
再利用性が下がるばっかりなのにバカじゃねぇの。

263 :デフォルトの名無しさん:2011/11/16(水) 20:02:23.70
>>262
アホですなぁ

264 :デフォルトの名無しさん:2011/11/16(水) 20:04:09.60
再利用するものは部品化して、設定は外部から与えるが、
再利用するわけもないものまでそんな事するのは無駄なだけ

265 :デフォルトの名無しさん:2011/11/16(水) 20:17:45.08
>>257
下みたいなのはよくつかう。ただしグローバルにはしない。
設定ファイル名は実行ファイルの名前使っとくのが無難。

class Fuga
{
     int settingA;
     int settingB;
     int settingC;
public:
     Fuga( const boost::property_tree::ptree &tree );
     void Restore( Window& );
};

// ptreeみたいな物で一回取り込んで設定をリストアするオブジェクトに展開しとくと楽。
boost::property_tree::ptree config;
read_xml( std::istream( ModuleName() + ".xml"), config );
Fuga configurator( config );

Window window;
configurator.Restore( window );


266 :デフォルトの名無しさん:2011/11/16(水) 20:19:03.74
>>264
設定自体は使い捨てなんだよ。
最利用するのはロジック部。
設定がロジックに入れ込むと取り外して再利用するのが難しくなる。

267 :265:2011/11/16(水) 20:22:01.70
std::istreamは要らん。間違えた。

268 :デフォルトの名無しさん:2011/11/16(水) 20:26:34.58
factory f; f.load("config.lua");
hoge h(f.make());


269 :デフォルトの名無しさん:2011/11/16(水) 21:07:39.60
>>266
再利用を見越したものは当然そうだろう
そういう物はそもそもライブラリ化しておく

270 :デフォルトの名無しさん:2011/11/16(水) 22:17:11.96
ぐふっ。
string でも wstring でも食っちまうんだぜ?的なカスタムの cout、ofstream を作ろうと一念勃起したんだけど
アルゴリズムに渡したり汎用マニピュレータを挿入したりできるようになるためには
template< charT, char_traits< charT > > ... の形になってないといけなくて、
それはつまり標準の特殊化をせよということで、じゃあとりあえず fstream でもと思ったら
それは basic_ofstream の特殊化であり、 basic_stream であり basic_ios の特殊化であり
そもそも最低限 char_traits の特殊化が必要な気配でありなんであり…もう、頭がフットーしそうだよおっっ。

なんか、良い文献知りませんか(´・ω・`)

271 :デフォルトの名無しさん:2011/11/16(水) 22:17:25.74
>>269

>そういう物はそもそもライブラリ化しておく

何を持ってライブラリと書いてるのか解からんが、
仮にライブラリを他のプログラムと共有するコードだとすると、
再利用できるからってライブラリに突っ込めんだろ。

ブラウザのタブやら、モデリングツールのビュー、DTMツールのビュー
そういったビュー系のオブジェクトをライブラリ化することはあまりない。
そのビュー自体がプログラムのアイデンティテであるし、拡張の対象になるから
枯れたものとしてライブラリに追加するのは難しい。
ビューの他にもシーケンス制御のノードとかコマンド系オブジェクトも同じ傾向にある。

272 :デフォルトの名無しさん:2011/11/16(水) 23:19:14.29
>>270
Boost.Iostream あたりで楽にならんのかな?

273 :デフォルトの名無しさん:2011/11/16(水) 23:27:30.76
ライブラリとして作るだけで
別に共用する必要は無い
改造して再利用するにしても、分離されてると色々と楽よ

274 :デフォルトの名無しさん:2011/11/16(水) 23:30:39.32
それはライブラリじゃなくてオブジェクトコードじゃないか?

275 :デフォルトの名無しさん:2011/11/16(水) 23:53:11.52
なんでやねん

276 :デフォルトの名無しさん:2011/11/16(水) 23:56:39.02
>>272
わかりました、ソース読んでみます。どもども。(´・ω・`)

277 :デフォルトの名無しさん:2011/11/17(木) 00:43:49.70
>>273
.libか.dllにするって言ってる?

278 :デフォルトの名無しさん:2011/11/17(木) 01:47:51.32
std::container<boost::weak_ptr<Type>>型のコンテナがあって、その中身1つごとに複数回アクセスする処理があるんだけど、
weak_ptr.lock()を呼び出すタイミングはどうしたらいい?
その度に呼び出していたら速度的に損だし、分岐も増えて、嫌だ

処理の初めにweak_ptr.lock()を呼び出して、取得したshared_ptr<Type>を他のdequeとかにつっ込んで、それに対して処理を行い、
処理が終わったそのdequeなりを空にする
こんな方法は間違ってないんだろうか

279 :デフォルトの名無しさん:2011/11/17(木) 01:50:18.16
修正
> 処理の初めにweak_ptr.lock()を呼び出して、・・・
処理の初めに"全ての要素の"weak_ptr.lock()を呼び出して

280 :デフォルトの名無しさん:2011/11/17(木) 07:10:33.55
最初から std::container<boost::shared_ptr<Type>> に出来ない理由があるのなら
それでいいんじゃない?

281 :デフォルトの名無しさん:2011/11/17(木) 08:48:44.67
生存してほしい期間に合わせてlockする

282 :デフォルトの名無しさん:2011/11/17(木) 13:35:10.63
>>270
クラスを自作するなら、
operator<< の中で reinterpret_cast すれば終わりじゃね?

283 :デフォルトの名無しさん:2011/11/18(金) 00:12:17.86
>>280-281
レスありがとう
とりあえずこのまま進めてみるよ

284 :デフォルトの名無しさん:2011/11/18(金) 16:33:51.11
返り値のテンポラリが生成されるタイミングって
返り値の構築→スコープ抜けるの順番でいいの?
例えば
Obj func() {
try { Obj obj; return obj }
catch(...) { /*...*/; }
}
と書いてreturn時のコピーコンストラクタで例外が発生したらキャッチされると保証されてる?

285 :デフォルトの名無しさん:2011/11/18(金) 19:47:27.97
普通は戻り値最適化が行われるから
コピーコンストラクタ自体動かないので
あまり考えた事無いな・・・

286 :デフォルトの名無しさん:2011/11/18(金) 20:09:37.07
デバッグでは戻り値最適化は恐らくカットされるので真面目に考えた方が良さそう

287 :デフォルトの名無しさん:2011/11/18(金) 20:19:19.10
function try blockでないのが気になってしょうがない

288 :デフォルトの名無しさん:2011/11/18(金) 20:50:07.17
>>284
仕様が気になるなら仕様見たら?

289 :デフォルトの名無しさん:2011/11/18(金) 21:08:45.26
前やってみたらデバッグでも戻り値最適化はされてたような
さらに昔にやったときはされなかった気もするが

290 :デフォルトの名無しさん:2011/11/18(金) 21:15:44.25
とりあえず、gccでは関数内のcatchに制御が移るみたい

ideoneコンパイル終わらない。。
ttp://ideone.com/QRPa5

291 :デフォルトの名無しさん:2011/11/18(金) 21:25:55.97
ぐは。。ideoneと手元の環境で、結果が違う…
ttp://ideone.com/6Ylmh

292 :デフォルトの名無しさん:2011/11/18(金) 21:44:20.61
戻り値最適化されてるだけじゃん

293 :デフォルトの名無しさん:2011/11/18(金) 22:02:46.96
-fno-elide-constructorsしろよ

294 :デフォルトの名無しさん:2011/11/18(金) 22:21:56.39
>> 6.6.3
>> (略)
>> A return statement can involve the construction and copy or move of a temporary object (12.2).
これはreturnに書いた式の評価とは別の話で関数の返却値となる一時オブジェクトについての話とみるのが自然だろう。

295 :デフォルトの名無しさん:2011/11/19(土) 16:23:24.81
ふ〜ん

296 :デフォルトの名無しさん:2011/11/20(日) 12:23:13.94
class Hoge {
  Hoge(Piyo * pPiyo = NULL)
   : pPiyo(pPiyo) {}
  void SetPiyo(Piyo * pPiyo) { this->pPiyo = NULL; }
  bool IsValid() { return p != NULL; }
  void Fuga() {
   assert(this->pPiyo != NULL); // これ
   ...
   this->pPiyo->FugaFuga();
   ...
  }

  Piyo * pPiyo; // nullable
};

上記の assert() に価値はありますか?

297 :デフォルトの名無しさん:2011/11/20(日) 12:24:29.26
誤:void SetPiyo(Piyo * pPiyo) { this->pPiyo = NULL; }
正:void SetPiyo(Piyo * pPiyo) { this->pPiyo = pPiyo; }

298 :デフォルトの名無しさん:2011/11/20(日) 13:27:50.82
>>296-297
それだけの内容で判断するのは無理。

しかし↓こっちのスレならなんとかしてくれるかもしれない。
http://hibari.2ch.net/test/read.cgi/tech/1187922645/

299 :デフォルトの名無しさん:2011/11/20(日) 18:29:08.39
SetPiyo()にNULL渡すアホがいる可能性が排除できるなら要らないかと

300 :デフォルトの名無しさん:2011/11/20(日) 18:46:21.72
NULLを入れられる設計なのだから
assertじゃなく、NULLなら何もしないか例外を投げるのが普通じゃ
まあ、速度的な要請からassertにしてるのなら仕方が無いが

301 :デフォルトの名無しさん:2011/11/20(日) 18:58:46.34
assert するなら設定時点でヌルを蹴るべきだし、そうしてないのなら assert はおかしい。

302 :デフォルトの名無しさん:2011/11/21(月) 03:39:11.45
レスさんくす

>>298
・初期値が NULL(Hoge(Piyo * pPiyo = NULL))であること
・SetPiyo(Piyo * pPiyo) が NULL を渡されることを認めていること
・IsValid() が、メンバ変数 pPiyo が NULL 代入を許可していることを前提としていること
・メンバ変数 pPiyo が NULL 代入を許可していること
これらのソースをご確認ください

>>299
SetPiyo() に NULL を渡すことは許可されています

>>300
速度的な問題で、リリースモードでは pPiyo != NULL のチェックをしない予定です

>>301
Hoge クラス内で pPiyo の先を参照した地点(this->pPiyo->FugaFuga())で、
デバッグモードであれば落ちた位置が分かれば十分であり、
リリースモードであれば abort されてしまっても構いません

303 :デフォルトの名無しさん:2011/11/21(月) 16:10:26.31
>>296
NULLがセットできたり、IsValid()があるってことは
無効という状態がありうる、もしくは容認する、とオレが使う側だったら考えるが
Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
一貫性が無く他人がHogeを使う事を考えていない設計だね

304 :デフォルトの名無しさん:2011/11/21(月) 17:01:56.79
>>303
> Hoge::Fuga()呼び出したらエラーも返さずにabortするってことだよね?
それはリリース時の動作です
>>296 では、デバッグ時に assert() が呼び出されます
Fuga() は google C++ スタイルガイドでいうところの、サフィックスに "OrDie" を付ける関数となります

305 :デフォルトの名無しさん:2011/11/21(月) 17:25:22.92
bool Fuga()にしてpPiyoがぬるぽならfalse返す仕様にすればいい
そうすりゃ動かなくても戻り値チェックしてないお前が悪いで通る

306 :デフォルトの名無しさん:2011/11/21(月) 18:46:55.84

std::vector<Klass*> v;
v.reserve(N);
Klass *pArray = new T[N];
for(int i=0; i<N; ++i){
pArray[i].init();
v.push_back(&pArray[i]);
}


//開放
delete [] v[0];
v.clear();
v.swap(v);

コンテナのインターフェイスを使いたいんですが、この使い方であってますか?
本当は、これ以上動的にメモリを確保することがないのでpush_backとか禁止したいのです。
継承するとか委譲を使って、ラップするしかないでしょうか?

307 :デフォルトの名無しさん:2011/11/21(月) 18:50:49.47
std::vector<Klass> v(N);
for(int i(0); i != N; ++i) {
v[i].init();
}


308 :デフォルトの名無しさん:2011/11/21(月) 19:45:54.64
v.swap( std::vector<Klass>() );

309 :デフォルトの名無しさん:2011/11/21(月) 20:31:09.39
>>307-308
ありがとうございます。
安全対策としてコンテナに実体を入れたくないんです。
と思ったがこれ以上メモリ確保しないならこれでいいかも、いやよくねーよ?
http://codepad.org/JBC4Abvr


310 :デフォルトの名無しさん:2011/11/21(月) 20:35:12.09
意味が分からないよ

311 :デフォルトの名無しさん:2011/11/21(月) 21:05:56.98
Klassにちゃんとコピーコンストラクタと代入演算子を定義してないからそうなる

312 :デフォルトの名無しさん:2011/11/21(月) 21:27:51.64
すまない。
別にコンテナに実体を入れるかポインタを入れるか、
コピーコンストラクタがとか聞きたかったわけじゃなかったんだ

俺規約としてコンテナにはポインタをいれることは絶対だったから、
実体入れるのは、頭になくて新鮮で、何で実体入れないんだと考えてたのが309

実際聞きたかったことは,、push_backとか禁止したvectorないのってことです

313 :デフォルトの名無しさん:2011/11/21(月) 21:34:09.74
boost::arrayじゃダメ?

314 :デフォルトの名無しさん:2011/11/21(月) 21:34:37.21
どうでもいいがCじゃなくKなのが気になる。
意味するところは解からんでもないがClassと書いて困ることも無いだろうに。

315 :デフォルトの名無しさん:2011/11/21(月) 22:03:04.88
>>312
配列そのままじゃ駄目なの?
begin、endの代わりにpArray、pArray+Nでどうにかなんないのかな

>>314
Kとlass(若い女性、娘、少女)で小娘って意味だろうきっと

316 :デフォルトの名無しさん:2011/11/21(月) 22:04:54.97
こういう場合はboost::ptr_vectorが便利そうだな
ポインタがコンテナから消えると自動的にポインタの指すクラスのデストラクタを
呼び出してくれる

317 :デフォルトの名無しさん:2011/11/21(月) 22:09:47.36
ソート用の参照配列だろ?
実態のコンテナとポインタのコンテナ2つ用意するのが堅実

318 :デフォルトの名無しさん:2011/11/21(月) 22:38:57.49
>>313
むしろboost::arrayがいいです。
クラスメンバにarray<T>とかサイズを後回しで宣言して使えるなら、使いたいです。

>>314
なぜklassの理由。何かから真似た。rubyの実装でこんな風に書いてあったような

>>315
実の目的はリファクタリングすることなのです。
newの仕方がうんこなので、まとめてnew[]するリファクタリングなんですが
vectorに放り込めばインターフェイス統一されてて楽なのです。、

>>316
ぐぐってみます

皆さんありがとうございました。

319 :デフォルトの名無しさん:2011/11/21(月) 23:03:21.38
AutoToolsで困ってます。

Cygwin1.7.5でMakeしたところ、ライブラリをテストするための実行ファイル生成のところで、以下のようなエラーになります。

libtool: link: cannot find the library `/usr/lib/gcc/i686-pc-cygwin/4.3.2/libstdc++.la' or unhandled argument `/usr/lib/gcc/i686-pc-cygwin/4.3.2/libstdc++.la'

手順としては以下のとおりです。
aclocal -I config
autoheader
automake --foreign --add-missing --copy
autoconf
./configure
make

/usr/lib/gcc/i686-pc-cygwin/ 以下の内容は次のとおりです。
$ ls -F /usr/lib/gcc/i686-pc-cygwin/
3.4.4/ 4.3.4/

各ツールのバージョンは以下のとおりです。
GNU automake 1.9.6
GNU Autoconf 2.65
GNU Make 3.81

configureあたりがgccのバージョンをご認識しているかと思うのですが、
どうしたらよいのでしょうか?

320 :デフォルトの名無しさん:2011/11/21(月) 23:10:51.88
>>318
まずは用語を適切に扱いなさい

321 :デフォルトの名無しさん:2011/11/22(火) 00:01:47.32
>>312
> 実際聞きたかったことは,、push_backとか禁止したvectorないのってことです
中身を変更しないか変更するときに毎回const_castする気があるならconst vector。

const vector<int> v(10);
const_cast<int&>(v[0]) = 1;
const_cast<int&>(*(v.begin() + 1)) = 2;

322 :デフォルトの名無しさん:2011/11/22(火) 00:05:21.27
下手の考え休むに似たり、とはよく言ったものだ


323 :デフォルトの名無しさん:2011/11/22(火) 11:36:33.62
文字列とポインタの事で質問です

#include <iostream>

using namespace std;

int main()
{
    char* c = "ABC";
    cout << c << '\n';
}

cは"ABC"の先頭要素のアドレスが入ると思うのですが、
cを出力した時にABCが出るのは何故なのでしょうか

324 :デフォルトの名無しさん:2011/11/22(火) 12:01:07.67
streamにchar*を受けたら文字列を出力する<<演算子がオーバーロードされてるはず
蛇足だけど文字列リテラルはconst char*で受けたほうが良い

325 :デフォルトの名無しさん:2011/11/22(火) 12:08:42.65
むしろ何が出て欲しい?
そこでアドレスが出て欲しい人って居るか?

という規定

326 :デフォルトの名無しさん:2011/11/22(火) 12:12:31.13
アドレスが出ないなんて神への冒涜だ
文字列が出したければstringでも使ってろカス

327 :デフォルトの名無しさん:2011/11/22(火) 12:18:58.25
横槍だけど、すると整数型にキャストしたりするとポインタのアドレスになったりするのか

328 :デフォルトの名無しさん:2011/11/22(火) 12:21:02.97
なるよ

329 :デフォルトの名無しさん:2011/11/22(火) 12:29:21.00
ちゃんと size_t で受けるんだぞ

330 :デフォルトの名無しさん:2011/11/22(火) 12:35:19.21
まぁvoidポインタにするだけでアドレス値は表示できる気が

331 :デフォルトの名無しさん:2011/11/22(火) 13:28:22.61
>>329
アウトだよ

332 :323:2011/11/22(火) 13:57:35.55
そういう風に決められてるんだなということはなんとなく分かりました
ありがとうございました

333 :デフォルトの名無しさん:2011/11/22(火) 20:56:19.11
size_tを進めてるヤツがいるがアドレス表示したいんならconst void*へキャストしろ。
size_tじゃアドレス出力用のフォーマットで出力しない。


334 :デフォルトの名無しさん:2011/11/22(火) 21:01:44.72
ポインタの表示は処理系依存
どんな環境でも整数として表示したいならsize_tかoffset_tにキャストして表示しなさい

335 :デフォルトの名無しさん:2011/11/22(火) 21:18:35.82
size_tにしてprintfで表示するのが一番手っ取り早い

336 :デフォルトの名無しさん:2011/11/22(火) 21:24:11.74
整数として表示したら見づらいだけだろ
現実問題、処理系依存だろうとポインタに最適化されてる
void*表示のほうが見やすい
そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。

337 :デフォルトの名無しさん:2011/11/22(火) 21:27:30.93
printfで出力すんなら%pでsize_tへのキャストなんかいらんだろ

338 :デフォルトの名無しさん:2011/11/22(火) 21:33:40.77
ポインタの表示は処理系依存だと何度言えば
自分で出力の仕方くらい決めさせてくれ

それに規格的には%pに渡すにはvoid*へのキャストが必須だから
大した差は無い(元からvoid*な場合以外)

339 :デフォルトの名無しさん:2011/11/22(火) 21:41:44.47
size_tも処理系依存じゃん
同じ処理系依存でもvoid*の方がフォーマットはともかくアドレス
表記で有ることが保証されてる情報落ちが無い分マシといってるだけ
まぁ、>>323 にsize_tにキャストはやめなといってる理由だから
詳しい子は好きにしたらいい

340 :デフォルトの名無しさん:2011/11/22(火) 21:45:20.32
整数型にしたいならintptr_tかuintptr_tにキャストするべきだけど
この2つはoptionalなので存在しない処理系もある
というかそもそもポインタを整数型にキャストできる保証もない

341 :デフォルトの名無しさん:2011/11/22(火) 21:50:13.79
処理系依存というか、例えばgccで先頭に0xが付くとか不快なんだよね
intptr_tやuintptr_tがあるならそれを使いたいけど今のところある環境ばかりじゃないしな・・・

342 :デフォルトの名無しさん:2011/11/22(火) 22:03:14.76
ptrdiff_t使えよド素人共が

343 :デフォルトの名無しさん:2011/11/22(火) 22:07:22.77
>>341
そこまで拘るんならカスタムマニュピレーターでも作ったほうが早くね

344 :デフォルトの名無しさん:2011/11/22(火) 22:09:08.61
>>342
符号付きの時点でイヤ

345 :デフォルトの名無しさん:2011/11/22(火) 22:10:08.08
>>344
頭だいじょうぶ?

346 :デフォルトの名無しさん:2011/11/22(火) 22:15:23.90
ptrdiff_tじゃsize_tと大差ないだろ

347 :デフォルトの名無しさん:2011/11/22(火) 22:38:47.87
ptrdiff_tはアドレスオフセットを格納するのに十分なサイズと決まっている
ptrdiff_tで何も問題は起こらない

348 :デフォルトの名無しさん:2011/11/22(火) 23:21:41.78
ptrdiff_tは同一オブジェクト内のオフセットだから
メモリ空間が分割されていたり単一プログラムが扱える範囲に制限があったりして
あまり大きなオブジェクトを扱えない環境では
ptrdiff_tがintptr_tより小さくてもおかしくない

349 :デフォルトの名無しさん:2011/11/22(火) 23:24:44.77
じゃあ何を使うんだよ

350 :デフォルトの名無しさん:2011/11/22(火) 23:42:04.60
今日のアンチ size_t スレ

351 :デフォルトの名無しさん:2011/11/23(水) 01:18:52.49
切り抜くアホ

352 :デフォルトの名無しさん:2011/11/23(水) 07:19:58.48
>>336
>そもそもsize_tが32bit、ポインタ64bitの環境じゃアドレスが欠ける。
そんなことあるの?

353 :デフォルトの名無しさん:2011/11/23(水) 08:18:33.70
>>352
64bitポインタ環境でsize_tが32bitとかかなり無意味だよな

354 :デフォルトの名無しさん:2011/11/23(水) 08:28:02.14
お前らアホばっかやな。仕様なんかどうでもいいんだよ、C++なんだからさ
仕様調べてる暇があったらパパッとメタプログラミングで最適なサイズを求めればいいだろう

355 :デフォルトの名無しさん:2011/11/23(水) 11:07:35.55
>>353
連続した2^32+1以上の領域の確保を
コンパイル時エラー&メモリ確保エラーにするなら
そういう仕様でもおかしくはない

356 :デフォルトの名無しさん:2011/11/23(水) 11:34:34.72
>>355
286のような集積度か低い頃のセグメンテーションなMPUだとそうかもしれないけど、64bitアドレスが可能なMPUではメリット無くないか

357 :デフォルトの名無しさん:2011/11/23(水) 11:37:37.64
ないよ
もしそうならそういう仕様もありうるという話をしただけで
メリットがあるという話はしていない

358 :デフォルトの名無しさん:2011/11/23(水) 13:56:15.81
C++標準ではintptr_tを使うという考えなんだから、素直に書けば↓だろ

#if intptr_tが使えない
namespace std { typedef intptr_t 処理系依存; }
#endif

処理系依存の所は変な技使わずlong longとかsize_tでも入れときゃいい

359 :デフォルトの名無しさん:2011/11/23(水) 14:04:51.66
>>340
std::uintmax_tなら必須だぜ

360 :デフォルトの名無しさん:2011/11/23(水) 14:16:00.36
uintmax_tがポインタの整数表現を格納するに十分だとは限らないし
uintptr_tが定義されない環境ではuintmax_tがuintptr_tに必要な大きさを持っていないと考えるほうが自然なんじゃないか

361 :デフォルトの名無しさん:2011/11/23(水) 14:23:26.66
http://codepad.org/aPp8eYYd
環境依存しないアドレスの最大値ってどうやって取得するの?
numeric_limitsはリンク先のように意味ないし

362 :デフォルトの名無しさん:2011/11/23(水) 14:34:14.44
ふむふむ。その様な環境ではポインターの値を保持する整数型が存在しないのですな。

>>361
numeric_limits<void *>の定義は static constexpr T max() noexcept { return T(); }
だからね。uintptr_tに変換して~0の値を見るしかないんでは?

363 :デフォルトの名無しさん:2011/11/23(水) 14:37:53.70
規格上~0がその符号なし整数型の最大値であるとは限らない

364 :デフォルトの名無しさん:2011/11/23(水) 14:57:53.26
why?

365 :デフォルトの名無しさん:2011/11/23(水) 15:02:50.69
3.9.1 Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number
of bits in the value representation of that particular size of integer.
確かにuintptr_tは符号無しではあるがunsignedと宣言されているわけではないな

366 :デフォルトの名無しさん:2011/11/23(水) 15:38:58.97
そういう意味じゃなくて、sizeof (unsigned int) が例えば4だからと言っても
32bitフルに使わないといけないわけじゃないって事じゃないの
30bitしか使わなくても別に規格上問題は無い

367 :デフォルトの名無しさん:2011/11/23(水) 15:40:53.37
~0uなら最大値だろうけど~0は符号付きの値だから
符号無しに変換してどうこうは保証されないってことか

368 :デフォルトの名無しさん:2011/11/23(水) 16:04:39.71
>>366
それを環境依存せずに取得できると思う方がおかしいぜ。
ちなみにWindowsはエディションによって搭載できるメモリが異なるが、
実行環境に合わせた表示までしたいの?

369 :デフォルトの名無しさん:2011/11/23(水) 16:26:14.78
マニュアルで調べてtypedefが無難ですね

370 :デフォルトの名無しさん:2011/11/23(水) 16:39:08.20
intptr_tが無いコンパイラってどれよ

371 :デフォルトの名無しさん:2011/11/23(水) 19:02:51.63
>>352
Nintendo 64とか、AMD64以前のコンパイラだとぼちぼち見る

372 :デフォルトの名無しさん:2011/11/23(水) 19:30:27.70
そもそもアドレス値の最大知りたいって、どんな状況で必要なんだ?

373 :デフォルトの名無しさん:2011/11/23(水) 19:42:52.46
std::cout << "Address:" << static_cast<void*>(&argc) << std::endl;

> Address:0x7fff61bf930c

64びっとぺーせーだとスタックが真ん中あたりから始まるからねぇ。

374 :デフォルトの名無しさん:2011/11/23(水) 19:50:55.67
>>372
アロケーター書くときとか

375 :デフォルトの名無しさん:2011/11/23(水) 19:57:59.77
>>374
アロケーター書くのにどうしてアドレス値の最大が必要になるのかkwsk

376 :デフォルトの名無しさん:2011/11/23(水) 20:11:37.53
size_t ってアドレス空間をカバーできる型なんだとばかり思ってたよ

377 :デフォルトの名無しさん:2011/11/23(水) 20:17:45.32
farとnearポインターがあった時点で
size_tにメモリー空間をカバーしろと仕様に書くのは無理だった訳で。
今でも、x86系のI/Oメモリー空間は別だし、どうやってもポインターサイズと
メモリー空間を対応付けるのは難しいよね。

378 :デフォルトの名無しさん:2011/11/23(水) 22:03:41.68
初心者です、お願いします。


新規にフォームアプリケーションプロジェクトを作成すると
左のソリューションエクスプローラーの中に、
「ソースファイル」と「ヘッダーファイル」があります。

map関数を使いたいのですが、
#include <map>は「stdafx.h」に書けばいいですか?

また、
「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と書きたいのですが、
「stdafx.h」に書けばいいですか?

379 :デフォルトの名無しさん:2011/11/23(水) 22:09:48.25
初心者過ぎてなんだかめんどくさいから説明はしないが
どちらもソースファイルに書けば使えるようになる

http://hibari.2ch.net/test/read.cgi/tech/1268613679/
次からはこっちできけ

380 :デフォルトの名無しさん:2011/11/23(水) 22:10:24.32
>map関数を使いたいのですが、
>#include <map>は「stdafx.h」に書けばいいですか?

関数じゃなくてクラステンプレートだよね?
使うとこでインクルードしてもいいけど、よく使いそうだし stdafx.h でいいと思われ

>「Debug::WriteLine」を使いたいので「using namespace System::Diagnostics;」と
>書きたいのですが、
>「stdafx.h」に書けばいいですか?

C++では通常ヘッダファイルでusingはおすすめ出来ないが
C++/CLIの流儀だとどうなのかねえ・・・
俺はC++の通常の流儀に従って関数内でusingしてるけど
C++/CLIスレで聞いた方がいいと思う

381 :デフォルトの名無しさん:2011/11/23(水) 22:12:31.10
>>380は、
「ヘッダファイル内では」関数内でのみusingという事ね

382 :デフォルトの名無しさん:2011/11/23(水) 22:13:46.93
>>376
いちおうptr_diff_t ってのはあるんだけどね

383 :デフォルトの名無しさん:2011/11/23(水) 22:13:58.76
>>378
stdafx.h に書いておくとなんだかの理由で(プリコンパイルヘッダ関連だったかな)
処理が速くなりますよみたいな事がどっかに書いてあった気がするけど
よほど遅いマシン/巨大プロジェクトを扱ってるのでない限りそのヘッダを必要するソース
に書いて良いですね.経験上.

384 :デフォルトの名無しさん:2011/11/23(水) 22:17:24.53
>>383
処理が早くなるって、通常実行時って言うよりはコンパイル速度が早くなる可能性があるだけでは?

385 :デフォルトの名無しさん:2011/11/23(水) 22:18:13.48
よくインクルードする奴はstdafx.hに書いておくと
何度も書かなくて便利というのもあるので
一概に速度だけの問題でもない

386 :デフォルトの名無しさん:2011/11/23(水) 22:18:47.71
この文脈では処理=コンパイルでしょ

387 :デフォルトの名無しさん:2011/11/23(水) 22:25:45.11
>>378
mapを使うクラスのヘッダーファイルでinclude すればいい
ライブラリ等の変更する頻度が低くて良く使うヘッダーファイルをstdafxに追加するとコンパイルが劇的に速くなる
なお、両方に書いても問題ないよ

388 :デフォルトの名無しさん:2011/11/23(水) 22:28:33.80
>>386
はいそのつもりでしたが誤解を招く表現でしたね

389 :デフォルトの名無しさん:2011/11/23(水) 22:37:34.60
gccのプリコンパイルドヘッダークソおせぇ。
通常コンパイルで1分掛かるヘッダーをプリコンパイルにしてもやっぱり1分掛かる。
やっぱテンプレートだとプリコンパイルは無意味なんかね。

390 :デフォルトの名無しさん:2011/11/23(水) 22:41:59.44
むしろ一番効果が出そうなんだけど

391 :デフォルトの名無しさん:2011/11/23(水) 22:42:22.61
むしろ一番効果が出そうなんだけど

392 :デフォルトの名無しさん:2011/11/23(水) 22:46:47.94
標準ライブラリは基本的にstdafx.hに突っ込んでるな
変更なんてあり得ないし、なにかとどこかで使うことになるし

393 :デフォルトの名無しさん:2011/11/24(木) 00:06:25.43
毎回プリコンパイルして使い回してなかったら笑ってやる

394 :デフォルトの名無しさん:2011/11/24(木) 00:07:52.55
毎回プリコンパイルって何だ
プリコンパイルは1回だけだぞ

395 :デフォルトの名無しさん:2011/11/24(木) 00:13:09.55
読解力のないやつだな

396 :デフォルトの名無しさん:2011/11/24(木) 00:20:40.37
ソースコード修正しただけで1分掛かる。
ヘッダーは変更しとらんよ。

397 :デフォルトの名無しさん:2011/11/24(木) 01:31:58.19
お前ら短文すぎて脈絡掴めないぞ

398 :デフォルトの名無しさん:2011/11/24(木) 03:32:02.69
テンプレートって使用された分の関数をコンパイル前に自動で作ってくれるってだけなんですか?

399 :デフォルトの名無しさん:2011/11/24(木) 03:51:33.60
まぁだいたいそんなもん。

400 :デフォルトの名無しさん:2011/11/24(木) 03:52:59.36
>>398
関数だけじゃなくてクラスも対象だし、コンパイル「前」じゃないし、
「だけ」といってもその恩恵は計り知れないけどな。

401 :デフォルトの名無しさん:2011/11/24(木) 07:18:06.74
クラスであっても、使わないメンバ関数は生成しないね

402 :デフォルトの名無しさん:2011/11/25(金) 10:57:50.50
SFINAEの原則。コレのお陰でメタプログラミングができる。

403 :デフォルトの名無しさん:2011/11/25(金) 12:00:01.71


404 :デフォルトの名無しさん:2011/11/26(土) 10:43:17.92
継承できるけどインスタンスはひとつに限られるクラスってどうやって記述すればいいんでしょうか
シングルトンって継承できないですよね?

405 :デフォルトの名無しさん:2011/11/26(土) 10:47:29.60
>>404
使いどころはあるの?

406 :デフォルトの名無しさん:2011/11/26(土) 10:48:37.73
モノステートを継承

407 :デフォルトの名無しさん:2011/11/26(土) 17:01:44.47
class crood{
public:
 int& X(){return _x;}
 int& Y(){return _y;}
 int X()const{return _x;}
 int Y()const{return _y;}
private:
 int _x,_y;
};

crood tmp;
tmp.X()=200;
tmp.Y()=-100;

int tmpx=tmp.X();//tmpx=200
上のような書き方でやればgetXとかsetXとか書かなくてすむけど単純な代入しか出来ないですよね?

tmp.Y()=-150;

とかしたときに

tmp.Y()が0になるように出来ませんか?
※マイナスの値が代入された時は0を代入する。

408 :デフォルトの名無しさん:2011/11/26(土) 17:08:21.05
privateの意味ねぇぇぇ

409 :デフォルトの名無しさん:2011/11/26(土) 17:13:44.03
>>407
Y を int& じゃなくて、別のclassにすればできる。
でもねぇ、これは思想が違うとしか。

410 :デフォルトの名無しさん:2011/11/26(土) 17:31:54.47
その書き方に利点はなんだ

411 :デフォルトの名無しさん:2011/11/26(土) 17:32:13.73
typo
その書き方の利点はなんだ

412 :デフォルトの名無しさん:2011/11/26(土) 17:32:57.95
http://codepad.org/RjlPqJs6
別クラスってーとこんな感じか?
便利そうな、そうでもないような…

413 :デフォルトの名無しさん:2011/11/26(土) 17:33:39.45
>getXとかsetXとか書かなくてすむけど
これじゃないの?
マクロ書いた方がまだマシな気もする

414 :デフォルトの名無しさん:2011/11/26(土) 22:32:34.97
>>407
脇道だが、座標系を表すオブジェクトのXとYなんて書き換えられる必要ないだろ。
書き換え自体は、オブジェクトの内部で完結してりゃ十分じゃん。
それと、X、Yと定義しているパターンはよくあるけど、関数ポインターが無いと
XとYの入れ替え指示ができないので、OOとしてはあんまり良くない。


415 :デフォルトの名無しさん:2011/11/26(土) 22:36:59.77
数学ベクトルはメンバ丸出しが最善手って常識だろ

416 :デフォルトの名無しさん:2011/11/26(土) 22:40:17.29
VC++の$(OutDir)の値を変更するのはどこ?/OUTはどこでどう使うの?

どうせ、スレ違いというだろうけど


417 :デフォルトの名無しさん:2011/11/26(土) 22:44:41.37
>>415
今は、SSEやGPGPUもあるしそういう時代でもない。

418 :デフォルトの名無しさん:2011/11/26(土) 22:45:28.92
>>416
解ってんならVSのスレに行けよ

419 :デフォルトの名無しさん:2011/11/27(日) 00:41:12.91
>>415
uBLASとかBlitz++とかマジもんの数学ライブラリは添字アクセスなんけど
どこの常識なんだろうか・・・。

420 :デフォルトの名無しさん:2011/11/27(日) 00:57:57.68
uBLASとかは汎用的な処理かつでかい行列ではまあまあ有効なんだよ
でも3DCGとかじゃただの構造体がベスト
まとまった数学操作はすべて関数で用意して環境別に中身を切り替える
常識です

421 :デフォルトの名無しさん:2011/11/27(日) 01:02:44.67
クラスでも同じ事できるだろ

422 :デフォルトの名無しさん:2011/11/27(日) 01:03:29.80
そんなんDirect Xぐらいだろ

423 :デフォルトの名無しさん:2011/11/27(日) 01:05:04.86
>>419
その添字アクセスはサイズを動的にするための犠牲であって
添字アクセスが優れているから採用したわけではない

424 :デフォルトの名無しさん:2011/11/27(日) 01:08:22.38
>>422
少なくともJavaと.NETは構造体的になっているようだが

425 :デフォルトの名無しさん:2011/11/27(日) 01:08:52.87
構造体の相対参照も、添字参照も速度は変わらんしな、何が犠牲なんだろ?

426 :デフォルトの名無しさん:2011/11/27(日) 01:10:37.19
32bit時代だとthisはレジスタ渡しだから
構造体よりはクラスの方が良さそう
64bit時代だと普通の引数も4つまでレジスタ渡しだから
引数多い関数でもなければ差はないね

427 :デフォルトの名無しさん:2011/11/27(日) 01:10:51.69
>>425
本気で言ってるなら病院

428 :デフォルトの名無しさん:2011/11/27(日) 01:12:06.77
>>424
数学系に独立してるわけじゃなく
X11やWin API引きずってるもんな。仕方ない。

429 :デフォルトの名無しさん:2011/11/27(日) 01:13:17.57
>>427
x86系の命令と、インライン展開された状態知ってて言ってるの?

430 :デフォルトの名無しさん:2011/11/27(日) 01:13:22.01
>>425
見やすさとか書きやすさかなぁ?

431 :デフォルトの名無しさん:2011/11/27(日) 01:14:23.93
2次元なのに3次元目を指定するとかの間違いはトラップできるよね
それだけだど

432 :デフォルトの名無しさん:2011/11/27(日) 01:15:48.97
どっちがいいかは実測してから議論しなさいって学校で教わったよね

433 :デフォルトの名無しさん:2011/11/27(日) 01:19:28.79
2か3に次元固定ならXYZ使うのが自然だろうし
任意のN次元を扱うクラスなら添え字が自然だろう。
どちらか片方が常識と言われると、アホと言いたくなる

とりあえず>>429は病院池

434 :デフォルトの名無しさん:2011/11/27(日) 01:24:21.69
速度は実際測っても差はないし、実測の問題じゃないと思うけど?
それより中身を直に晒すと参照とか使えないのがキツイ。

iterator x,y;
Vector( iterator x, iterator y ):x( x ), y( y ){}
int X( void ) const { return *x;}
int Y( void ) const { return *y;}
operator += ( const Vector &vector )
{
       *x += X();
       *y += Y();
}

こういう委譲スタイルが使えない。

435 :デフォルトの名無しさん:2011/11/27(日) 01:26:43.53
>>433
お前話の脈絡がめちゃくちゃだぞ
>>425の話と全然繋がってないじゃん

436 :デフォルトの名無しさん:2011/11/27(日) 01:28:57.55
おまえら最初の質問に答えてないよね

437 :デフォルトの名無しさん:2011/11/27(日) 01:29:59.03
>>434
なにそのキモイコード

438 :デフォルトの名無しさん:2011/11/27(日) 01:32:06.80
>>434
>中身を直に晒すと参照とか使えない
日本語でお願いします

439 :デフォルトの名無しさん:2011/11/27(日) 01:34:11.25
>>437
GPUやSSE用の頂点配列の1要素を、
単体のベクトルに委譲するコード。
最近似たようなのをちょくちょく見かけるね。

440 :デフォルトの名無しさん:2011/11/27(日) 01:35:31.15
>>438
中身丸出しってのはこれのこと
>数学ベクトルはメンバ丸出し


441 :デフォルトの名無しさん:2011/11/27(日) 01:37:43.87
とりあえず>>434は病院池

442 :デフォルトの名無しさん:2011/11/27(日) 01:39:18.21
>>439
要素分けて参照させる必要あるの?
ベクトル単位で参照したほうがいいだろ

443 :デフォルトの名無しさん:2011/11/27(日) 01:47:26.67
>>442
SSEだと、ベクトル集合の演算は、次元毎に加算したほうがやりやすいんだよ。

例えば適当に書くけどこんな感じ
float x[128], y[128];
*( (*__m128) x ) += (__m128){ 1, 1, 2, 2 };
*( (*__m128) y ) += (__m128){ 1, 1, 2, 2 };

444 :デフォルトの名無しさん:2011/11/27(日) 01:57:45.92
>>416
> VC++の$(OutDir)の値を変更するのはどこ?
使わなきゃいいだろ。

445 :デフォルトの名無しさん:2011/11/27(日) 01:59:34.60
もっと根本的な事を書かないと何故参照が必要か説明不足か。

SSEArray<2> model(100);
model += Vector<2>(10, 20);
model[0] += Vector<2>(10, 20);

元々、SSE用のベクトル集合があって、
ベクトル集合全てに加算する場合と、
1要素に対し加算する場合がある。

SSE用のベクトル集合の内部は>>443の用に
内部で次元毎に別れて格納されてる。

そのままでは、1要素のベクトル演算には使えないから、
一旦ベクトル集合の1要素を参照するベクトルオブジェクトに
委譲してやる必要があるわけ。

446 :デフォルトの名無しさん:2011/11/27(日) 02:10:02.90
ary.add(idx, v2(1, 2));
でいいよ
へんなアダプタかませてカッコつける必要性皆無

447 :デフォルトの名無しさん:2011/11/27(日) 02:20:19.06
テンプレート活用できないからそれじゃ困る。

448 :デフォルトの名無しさん:2011/11/27(日) 12:42:56.84
iteratorじゃなくて参照にすればset/get経由しなくてもいいのにね

449 :デフォルトの名無しさん:2011/11/27(日) 12:48:30.77
普段はstd::pairとかtupleみたいに扱えて
速度が必要になったらちょっとPolicyを差し替えるだけでSIMD使うものにできるみたいな

450 :デフォルトの名無しさん:2011/11/27(日) 17:35:54.87
すみません
std::ifstream::getline があるのは知っているのですが
std::ifstream::get を使った場合したのプログラムが正常に動きません
(入力ファイルに空行があるとそこで無限ループになるっぽいです)

std::ifstream ifs;
ifs.open("main.cpp");
if(ifs){
std::streamsize sz = 64 + 1;
char buf[sz];
do{
ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(strlen(buf) < sz - 1) ifs.seekg(1, std::ios::cur); // skip delimiter
std::cout << buf << std::endl;
}while(!ifs.eof());
ifs.close();
}

どこがおかしいのでしょうか?

451 :デフォルトの名無しさん:2011/11/27(日) 17:58:04.04
ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(!ifs)
 if(ifs.eof()) break;
 else ifs.clear();
if(strlen(buf) < sz - 1) ifs.seekg(1, std::ios::cur); // skip delimiter
std::cout << buf << std::endl;


452 :デフォルトの名無しさん:2011/11/27(日) 18:07:28.80
ああバグってるな

ifs.get(buf, sz, '\n'); // read before delimiter '\n'
if(!ifs)
 if(ifs.eof()) break;
 else ifs.clear();
else std::cout << buf;
if(strlen(buf) < sz - 1){
 ifs.seekg(1, std::ios::cur); // skip delimiter
 std::cout << std::endl;
}


453 :デフォルトの名無しさん:2011/11/27(日) 18:15:44.28
>>451 さん!
出来ました!!
ありがとうございます!!!

454 :デフォルトの名無しさん:2011/11/28(月) 04:45:39.90
なんでdowhileなんだ?

455 :デフォルトの名無しさん:2011/11/29(火) 21:54:49.93
if(x.isNantoka()) {
x.doKantoka();
}
的なコードを見やすくするために
x.isNantoka() && x.doKantoka();
って書くのっておかしいですか?

456 :デフォルトの名無しさん:2011/11/29(火) 22:03:13.87
いとをかし

457 :デフォルトの名無しさん:2011/11/29(火) 22:04:14.88
あまり行儀良くはないな

458 :デフォルトの名無しさん:2011/11/29(火) 22:23:46.58
そういうのはコードゴルフだけでやればいい

459 :デフォルトの名無しさん:2011/11/29(火) 22:25:29.03
自分だったら、
if (x.IsXxx() == true) x.DoXxx();

と、一行で書けるときはそうする。

460 :デフォルトの名無しさん:2011/11/29(火) 22:36:52.53
英語文法的には
if hoge and fuga or piyo.
hogeであるならばfugaでなければpiyoってなるからすごいわかりやすいんだけどね

461 :デフォルトの名無しさん:2011/11/29(火) 22:37:27.33
シェルで似た書き方をたまに見るよ。
たしか miracle linux のオラクル起動シェルがそれ多用してた...

古いPerlのソースではよく
処理() || die;
つーのがあって「処理をしろ、さもなくば死ね」
と読ませたかったポ。原理は同じだよな。

でも考えたら
if( ptr != NULL && ptr->isHoge() ) {
...
}
ていう、nullガードのパターンはよく見る。
程度問題っていうか、読む人への優しさの問題かな

462 :デフォルトの名無しさん:2011/11/29(火) 23:09:44.84
nullガードとは別の話だろー
Perlでは見ない事も無い書き方だけど
C/C++的には正直読み辛い

463 :デフォルトの名無しさん:2011/11/29(火) 23:22:59.65
Luaとかだとむしろ推奨されてるよね

464 :デフォルトの名無しさん:2011/11/29(火) 23:39:22.25
C++はNULLないしfalseだと処理をすっ飛ばす
コンディション変数ってもんも有るんだがね。
NULLガードが見づらいって人は、コンディション変数も嫌いかもね。

// こういうヤツ
if( X x = a.ToX() ) return x;

465 :デフォルトの名無しさん:2011/11/29(火) 23:52:05.65
読み辛いって言ってんのはこれだぞ
x.isNantoka() && x.doKantoka();

466 :デフォルトの名無しさん:2011/11/30(水) 00:00:34.48
>>465
いや解ってるよ。コンディション変数が苦手な人と趣向が同じだよねって言ってるの。

467 :デフォルトの名無しさん:2011/11/30(水) 00:02:39.64
本来の使い方から逸脱してるから
趣向が同じ訳ではないと思うの

468 :デフォルトの名無しさん:2011/11/30(水) 00:04:28.24
そういやショートサーキット( &&, || ) による分岐は無しだわ。
オーバーロードに気づかなかったら、ショートサーキットが効かず事故る。

469 :デフォルトの名無しさん:2011/11/30(水) 00:04:57.08
>>455
なぜ見やすいコードを見にくいコードに置き換えようとしているのかが分からない

470 :デフォルトの名無しさん:2011/11/30(水) 00:05:42.47
オーバーロードはまあ罠だよね
でも&&や||のオーバーロードってそんなあるかな?

471 :デフォルトの名無しさん:2011/11/30(水) 00:07:02.58
break if (x.isNantoka());
と書きたくなることはある

472 :デフォルトの名無しさん:2011/11/30(水) 00:12:35.19
オーバーロードするとしたら、遅延評価か2論理値以外を使いたい時になんのかな。


473 :デフォルトの名無しさん:2011/11/30(水) 00:15:58.93
>>455
C++で&&とあったら評価の途中の副作用でなく結果のbool値のほうを注目するから一般的ではないだろうな

474 :デフォルトの名無しさん:2011/11/30(水) 01:48:20.04
どっちが先に評価されるかは決まってるんだっけ

475 :デフォルトの名無しさん:2011/11/30(水) 02:50:40.40
>>459 論理定数との等値比較を書いていいのは小学生まで。

476 :デフォルトの名無しさん:2011/11/30(水) 02:51:27.40
>>474
決まってるよ

477 :デフォルトの名無しさん:2011/11/30(水) 08:21:47.37
すみません
VB でいう MyBase、C# でいう base は C++ では何になるのでしょうか。

継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。
this だと自分自身を指しますよね?

478 :デフォルトの名無しさん:2011/11/30(水) 08:27:43.85
親クラスの名前::呼び出したいメンバ

479 :デフォルトの名無しさん:2011/11/30(水) 08:53:46.38
>>477
多重継承できるC++では明示的に親を示すキーワードはない。

480 :デフォルトの名無しさん:2011/11/30(水) 10:54:29.73
struct B1 { void f(); };
struct B2 { void f(); };
struct D: B1, B2 { void f(); };

D d;
d.B1::f(); // B1のf
d.B2::f(); // B2のf
d.f(); // Dのf


481 :デフォルトの名無しさん:2011/11/30(水) 11:10:02.02
ここまで俺の自演

482 :デフォルトの名無しさん:2011/11/30(水) 12:34:42.48
>>480
それって隠蔽されてる関数を無理矢理引っ張り出す書式だよな
親を指すポインタはdynamic_castを使って2個作るしかない事には変わりがない

483 :デフォルトの名無しさん:2011/11/30(水) 12:52:54.30
template <class T> struct Interface {
T * p ;
Interface(T * p) : p(p) { }
void f() { p->T::f() ; }
} ;

struct D: B1, B2 {
Interface<B1> base1() { return this; }
Interface<B2> base2() { return this; }
void f();
};

D d;
d.base1().f() // B1のf
d.base2().f() // B2のf
d.f() // Dのf

484 :デフォルトの名無しさん:2011/11/30(水) 19:35:05.37
>>477
>>478のやりかたで正しい。

485 :デフォルトの名無しさん:2011/11/30(水) 19:36:26.08
>>482
別に無理矢理じゃないだろ。
多重継承で衝突した時の基本的な対処法じゃん。

486 :デフォルトの名無しさん:2011/11/30(水) 19:37:06.33
>>482
static_castで十分ですけど

487 :デフォルトの名無しさん:2011/11/30(水) 19:38:13.33
>>483
オーバーライドする気がないならstatic_castの方がマシ。

488 :デフォルトの名無しさん:2011/11/30(水) 19:42:09.00
baseと書きたいならtypedefすればいい

489 :デフォルトの名無しさん:2011/11/30(水) 20:14:24.23
>>487
オーバーライドしててもstatic_castっていうか暗黙のダウンキャストで十分ですけど

490 :デフォルトの名無しさん:2011/11/30(水) 20:18:53.94
アップキャストだろ
ダウンキャストを暗黙でやられたら大変なことに

491 :デフォルトの名無しさん:2011/11/30(水) 20:23:32.23
>>489
base1やbase2が別のクラスのオブジェクトを返す場合は困るってこと。

492 :デフォルトの名無しさん:2011/11/30(水) 20:30:46.87
結論:無意味に他言語の真似をするのはアホ

493 :デフォルトの名無しさん:2011/11/30(水) 21:26:10.52
>>483
済みません

Interface<B1> base1() { return this; }

こういう場合ってメンバ関数の返却値でInterfaceの引数付きコンストラクタを
呼び出していますが、これって規格票のどこに説明がありますか?

初めて見たのでこういう書き方が出来るなら便利です

今までローカル変数に代入してから返していました

494 :デフォルトの名無しさん:2011/11/30(水) 21:31:58.27
その分だと explicit コンストラクタすら知らないんじゃないのかね
規格の前に入門書読みなさい

495 :デフォルトの名無しさん:2011/11/30(水) 21:34:39.66
explicitは知っています
ロベールと詳説C++を読んだけどどこにも書いてありません
JISの規格にも関数の返却値でコンストラクタを初期化する内容が
ちょっと見つからなかったもんで

496 :デフォルトの名無しさん:2011/11/30(水) 21:44:24.07
コピーコンストラクターってあるだろ、
あれの引数の型を、自分の型とは関係ない型にしてるだけ。
変換コンストラクターという。

497 :デフォルトの名無しさん:2011/11/30(水) 21:45:22.88
返却値で暗黙変換が出来ないと思ってたなら無駄なことしてたね

498 :デフォルトの名無しさん:2011/11/30(水) 21:47:46.05
std::string hoge() { return "hoge"; }
とか普通にやるよね

499 :デフォルトの名無しさん:2011/11/30(水) 21:52:06.13
>>496-497
ありがとうございます
これでかなり書き方が変わります

>>498
それは無意識のうちにやっていました
良く考えるとそれも変換コンストラクタなんですね

500 :デフォルトの名無しさん:2011/12/01(木) 00:14:45.78
>>477
MSに依存したものであれば、__superというキーワードが使える。
http://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx


501 :デフォルトの名無しさん:2011/12/01(木) 00:24:46.14
コミュ障かよ。仮にも第三次産業で飯食ってんだから
質問者が何を要求してるか考えろよ。

>継承クラスの子メンバで、親のメンバを明示して実行させたいのですが。

502 :デフォルトの名無しさん:2011/12/01(木) 00:38:00.12
>>501
質問の日本語がまずおかしい

503 :デフォルトの名無しさん:2011/12/01(木) 00:53:59.62
客が中途半端な受け答えしたら、客を責めるのかよ。

504 :デフォルトの名無しさん:2011/12/01(木) 07:09:58.34
金よこせばまともに回答するぜ

505 :デフォルトの名無しさん:2011/12/01(木) 08:06:33.61
Qみたいな事言ってんなよ
カネカネキンコはプログラム板から出てけよ

506 :デフォルトの名無しさん:2011/12/01(木) 11:07:43.55
ここまでおれのじえん

507 : ◆QZaw55cn4c :2011/12/02(金) 03:50:03.42
>>505
Qって何です?

508 :デフォルトの名無しさん:2011/12/02(金) 08:23:53.23
Qでカネカネと言ったらQbert

509 :デフォルトの名無しさん:2011/12/03(土) 16:03:49.21
僕と契約して(徹夜で)プログラムを作ってよ!

510 : ◆QZaw55cn4c :2011/12/03(土) 16:06:58.67
>>509
http://hibari.2ch.net/test/read.cgi/tech/1313183984/

511 :デフォルトの名無しさん:2011/12/03(土) 16:09:04.30
Qの話の流れなのに・・・

512 :デフォルトの名無しさん:2011/12/05(月) 17:35:13.81
初期化の話だけど、組み込み型も括弧を使った形式の方がいいの?

int a = 100;

int a(100);

変わりが無いのであれば、後者の方で統一してしまいたいんだが、どうだろうか

513 :デフォルトの名無しさん:2011/12/05(月) 17:39:18.21
どちらでもいいよ


514 :デフォルトの名無しさん:2011/12/05(月) 18:09:59.76
struct foo{
static const int bar = 100; //できる
static const int baz(100); //できない
}

515 :デフォルトの名無しさん:2011/12/05(月) 18:15:15.15
奇妙な仕様だよね

516 :デフォルトの名無しさん:2011/12/05(月) 18:48:28.45
じゃあ後者で統一しようか
でも他の人のソース見ても後者を使用している人って居ないんだよな

>>514
そんなことより静的イニシャライザが欲しい

517 :デフォルトの名無しさん:2011/12/05(月) 19:18:22.42
欲しがるな
自分で作れ

518 :デフォルトの名無しさん:2011/12/05(月) 19:27:41.44
class Hoge {
class Initializer {
static int count; // 0初期化すること
public:
Initializer(void) { if(count == 0) Hoge::Initialize(); ++count; }
~Initializer(void) { --count; if(count == 0) Hoge::Finalize(); }
};
static void Initialize(void);
static void Finalize(void);
Initializer initializer_;
public:
// ...
};

これでおk

519 :デフォルトの名無しさん:2011/12/05(月) 19:39:50.94
class Hoge {
 static PrintHogeAndPiyo()
 {
  print(..., statics.hoge, statics.piyo);
 }

 class StaticFields {
  StaticFields()
   : hoge(0),
    piyo(23) {}

  int hoge;
  const int piyo;
 };

 static StaticFields statics;
};

ドヤァ・・・

520 :デフォルトの名無しさん:2011/12/05(月) 19:49:20.02
>>519
これは酷い

521 :デフォルトの名無しさん:2011/12/05(月) 20:05:17.60
struct hoge{
constexpr A() : m() { }
int m;
};
constexpr int v

522 :デフォルトの名無しさん:2011/12/05(月) 20:09:49.41
CRTPにするとき仮想関数使ったらあんま意味ないのはわかるけど
ほかになんか気をつけなきゃいけないことってある?

523 :デフォルトの名無しさん:2011/12/05(月) 20:13:05.23
public継承で事故を起こすことかな

524 :デフォルトの名無しさん:2011/12/05(月) 20:33:51.33
>>516
どうなるか解ってると思うが、参考までに。

Type function()
{
      return Type();
}

void function()
{
      return void();
}

int function()
{
       return int();
}


525 :デフォルトの名無しさん:2011/12/05(月) 21:09:40.69
>>524
解ってない

return Type(); → デフォコン呼ばれたType型オブジェクトが返される
return void(); → 予想: わかんない
return int(); → 予想: int型の不定値が返される

526 :デフォルトの名無しさん:2011/12/05(月) 21:12:53.51
33点

527 :デフォルトの名無しさん:2011/12/05(月) 21:14:28.89
デフォこん
何も返らない
0

528 :デフォルトの名無しさん:2011/12/05(月) 21:41:59.67
全部デフォコン

529 :デフォルトの名無しさん:2011/12/05(月) 22:22:09.46
>>525
テンプレートで問題が起きないように、
関数型キャストは、全て何らかの初期化になっている。
定数で初期化するより、君が使おうとしてる、関数型キャストの方が
汎用性がたかいんだよ。


530 :デフォルトの名無しさん:2011/12/05(月) 23:43:49.82
>>527
return int(); が 0 を返すってマジかYO。というかマジだった
ローカル変数の初期値は不定値なのに、これは0に初期化されるのか
なんか不思議な感じがするんだけど、この仕様に理由があったりするの?

>>529
static const int baz(100) ←これ
・・・が関数型キャストと呼ばれているの?
それはそうと、自分もテンプレートを作成している際にこれを使った方が色々と都合が良いと思ったんだよね

template <typename T>
T Func() {
 T a = 100; // 代入したいんじゃない
 T b(100); // 初期化したいんだ
}

531 :デフォルトの名無しさん:2011/12/06(火) 00:48:26.83
POD型のデフォルトコンストラクタ呼び出しは0初期化
そして非explicitコンストラクタの場合
> T a = 100; // 代入したいんじゃない
> T b(100); // 初期化したいんだ
このふたつは等価だから

template <typename T>
void func(){T t = T();}
と書けばTがPODでも初期化できる

532 :デフォルトの名無しさん:2011/12/06(火) 00:58:07.04
std::string s = "これを代入だと思ってたから括弧でやりたがってたの?";

533 :デフォルトの名無しさん:2011/12/06(火) 01:52:16.33
>>530
int n = int();
関数型キャストと言ったのはこっちの事。
言うには言ったけど間違ってたと思う。
int n = int( 100 );ってのは関数型キャストで間違いない。
int()だと多分デフォコンが正しいんだろう。

534 :デフォルトの名無しさん:2011/12/06(火) 07:17:27.76
>>531
等価じゃないよ
T a = 100; は T(int) が public でも
コピーコンストラクタが private なら外では使えない
(たとえコピーコンストラクタの実行が最適化で省略されるとしても)

535 :デフォルトの名無しさん:2011/12/06(火) 09:15:32.61
左様

536 :デフォルトの名無しさん:2011/12/06(火) 11:48:08.93
T a = 100;
T b(T(100));
これなら等価かな?関数宣言と見なされてエラーになっちゃう?

537 :デフォルトの名無しさん:2011/12/06(火) 18:33:48.41
つまりコピーコンストラクタをprivateにつっ込まない限り、その2つの処理は等価
どちらの記法を使うかは勝手ということか

>>533
なるほど
関数型キャストでは検索に引っかからなかったが、「T型の値 <= T(違う型の値)」がそれなのは理解した

>>534-536
環境: vs2005

class Hoge {
public:
 Hoge(int) {}
private:
 Hoge(const Hoge &) {}
};

Hoge h1 = 100; // ok
Hoge h2(100); // ok
//Hoge h3 = Hoge(100); // error C2248
//Hoge h4(Hoge(100)); // error C2248

538 :デフォルトの名無しさん:2011/12/06(火) 19:31:00.93
コピーコンストラクタをprivateにする事は往々にしてあるので(C++11だと=deleteか)
意外と等価なケースばかりではないのよね

539 :デフォルトの名無しさん:2011/12/06(火) 19:36:09.47
0xだと
hoge h = {1, 2, 3};
とか
hoge h({5}), g{6};
みたいに書けるんだっけ
なんか気味悪い


540 :デフォルトの名無しさん:2011/12/06(火) 20:49:33.23
stdintがまだない環境で
指定のビット幅を持つ整数型を得るにはどうすればいいですか?

541 :デフォルトの名無しさん:2011/12/06(火) 20:58:29.71
自分でstdint相当のものを用意するしかない

542 :デフォルトの名無しさん:2011/12/06(火) 21:18:10.45
ちょっと伺いたいのですが。。
stlにbitset<>(固定ビット数指定)がありますが、
可変ビットを指定出来るにはまだ先になるの?

やっぱりまだboostを使わなきゃならないのかな?

543 :デフォルトの名無しさん:2011/12/06(火) 21:26:13.45
入れようともしてないんじゃないのかな
ビットフラグって予め意味が決められてるから
可変にしても仕方が無いとか
拡張性を考えるとそうとも限らないとは思うけど

544 :デフォルトの名無しさん:2011/12/06(火) 21:29:40.15
自分は多倍長整数試作したときにあるといいなーと思った。論理演算を実装したかったからね。
まーポシャったけど。

545 :デフォルトの名無しさん:2011/12/06(火) 21:32:15.27
ビット演算したいだけならstdintよりbitsetのほうが良いのかな
速さは殆ど変わらないよね?

546 :デフォルトの名無しさん:2011/12/06(火) 21:33:32.96
TR2への提案はされていたはず

547 :デフォルトの名無しさん:2011/12/06(火) 21:45:06.52
>>544
作ったけど別に必要なかったような
除算だけが難しかった

548 :デフォルトの名無しさん:2011/12/06(火) 21:48:33.76
>>547
その時は基数がなにかとか殆どわからなくて言語に依存してたからビット演算を自前で実装出来なかったんだ・・・。Orz

549 :デフォルトの名無しさん:2011/12/07(水) 16:38:05.24
メンバ関数のconstって論理的にオブジェクトの内容が変化しないときに付けるのか
メモリの書き換えが起こらないときに付けるのかどっちが一般的なんですか?
pImplイディオムを使うときや関数オブジェクトを作る時などにすごく悩みます


550 :デフォルトの名無しさん:2011/12/07(水) 16:49:16.89
>>549
メンバ変数の書き換えが起きない時

551 :デフォルトの名無しさん:2011/12/07(水) 17:50:04.43
便乗
 const char *hage;
の const 対象はポインタだけだよね?

 hage = new_hage;   ← NG??

ちなみに
 strcpy((char *)hage, 'hage!');
は通るよね、どう理解したらいいんだい


552 :デフォルトの名無しさん:2011/12/07(水) 17:55:04.32
>>551
ポインタ先の書き換えであってポインタ自体は書き換えていい
あとCスタイルのキャストはconstは外れる

553 :デフォルトの名無しさん:2011/12/07(水) 19:35:21.06
@ char * hage1;
 このポインタが指している変数の変更: 可能
 このポインタの変更: 可能

A const char * hage2;
 このポインタが指している変数の変更: *不可能*
 このポインタの変更: 可能

B char * const hage3 = &betsuno_hage;
 このポインタが指している変数の変更: 可能
 このポインタの変更: *不可能*

C const char * const hage4 = &betsuno_hage;
 このポインタが指している変数の変更: *不可能*
 このポインタの変更: *不可能*

554 :デフォルトの名無しさん:2011/12/07(水) 19:45:05.40
>>553
おお、初めて知った

ついでに質問だけど、ある変数を途中からconst扱いにってできる?

555 :デフォルトの名無しさん:2011/12/07(水) 20:34:49.43
>>551
仕様を知りたいわけじゃないなら、
コンパイルしてみたらええがな。
今時、その辺が仕様からズレてる
コンパイラも無いぞ。

556 :デフォルトの名無しさん:2011/12/07(水) 21:39:53.83
>>549
結果をキャッシュして、キャッシュがあればそれを返す、というような場合は、
キャッシュ変数を mutable にして、メンバ関数を const にするような事はある

557 :デフォルトの名無しさん:2011/12/07(水) 22:15:00.64
>>554
無理・・・と考えていい

int x;
if (!tryGetX(..., &x)) { return false; }

こういう状況はよくあるよね。この地点でxを固定したい

558 :デフォルトの名無しさん:2011/12/07(水) 22:39:50.01
>>557
無理なのかーまあ途中からconstで変数増やせばできるといえばできるが

一旦定義してfor文で回した後は固定したいとかよくあるよね

559 :デフォルトの名無しさん:2011/12/07(水) 22:51:24.86
C++なんだから例外使えばいいよ

int tryGetX_(...) {
int x;
if(tryGetX(..., &x)) return x; else throw exception;
}

try {
const int x(tryGetX_(...));
...
}
catch(...) {
return false;
}


560 :デフォルトの名無しさん:2011/12/07(水) 22:53:42.48
tryGetの類いは例外を避ける為に作られる関数なんだから
例外使えば良いよってのはない

561 :デフォルトの名無しさん:2011/12/07(水) 23:02:58.42
うるせーじゃあoptionalでも使ってろ

562 :デフォルトの名無しさん:2011/12/07(水) 23:17:49.31
bool is_success;

const int x = GetX( &is_success );
if( is_success ){}
else {}

throw使いたくないなら引数に判定を持ってくるぐらいしかないだろ

563 :デフォルトの名無しさん:2011/12/07(水) 23:29:48.15
なんだかんだ言って例外が一番スマートだね
例外が駄目だっていう人も殆どはただの好みの問題で拒否ってるだけだし

564 :デフォルトの名無しさん:2011/12/07(水) 23:39:44.89
if( !IsXNull() ) return;
cont int x = GetX(); // 結局ここでIs〜で取りこぼした分は例外にしなきゃならん。無駄。


565 :デフォルトの名無しさん:2011/12/07(水) 23:43:02.55
突然どうした

566 :デフォルトの名無しさん:2011/12/08(木) 10:15:05.17
他の言語は知らんけどCプラプラでメソッドってあまり存在価値無くないですか?
例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
テンプレートを使うと特に顕著です
テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
利用者側がカスタマイズする時に助かるからです
でもこんなことなら最初から関数にすればいいのではないでしょうか?

567 :デフォルトの名無しさん:2011/12/08(木) 10:44:26.99
beginだけ例に挙げていらんと言われても俺はないと困る

568 :デフォルトの名無しさん:2011/12/08(木) 10:48:33.43
困らない人なんていないでしょ

569 :デフォルトの名無しさん:2011/12/08(木) 12:49:44.32
>>566
仮想関数どうすんの?

570 :デフォルトの名無しさん:2011/12/08(木) 13:01:14.63
>>566
>例えばbeginメソッドとか書いても結局使うのはブーストのbegin関数(かそれを真似した関数)を通して使いますよね
>テンプレートを使うと特に顕著です
>テンプレート型のオブジェクトのメソッドをコールするときは必ずメソッドをコールするだけの関数を通して呼びます
boostのbeginは配列とコンテナに同じインターフェースを設けるためだよ
意味不明な理由でインターフェース増やしまくる馬鹿はおまえだけ

571 :デフォルトの名無しさん:2011/12/08(木) 13:04:58.90
>>588
>>559-564といった感じで上手い方法は無い

ループ内の処理が長いのであれば、その部分をinline関数として抜き出して、その関数の戻り値をconstで受け取ればいい
ループ内の処理が短かったり、inline展開されるか不安であれば、我慢して非constで使う
最適化を気にしているのであれば、ローカル変数がconst/非constであることはそれにほぼ関与しないから問題ない

まぁ、throwされた時のコストを気にすべき環境では例外は使わないかな

572 :デフォルトの名無しさん:2011/12/08(木) 13:37:08.33
ループするなら関数呼び出しも例外もコストなんか気にしないのが普通

573 :デフォルトの名無しさん:2011/12/08(木) 23:45:25.75
>>566
>でもこんなことなら最初から関数にすればいいのではないでしょうか?
すればいいんじゃね。
仮想関数との透過的扱いが不要だと思うんなら、全てfriendにするなり好きにしたらいいんじゃね。
いつの日か多重メソッドに対応するものができたら得するかもしれん。

 どうでもいいが、C++は、Smalltalkの様にメッセージとメソッドが別れてないから、
メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。

574 :デフォルトの名無しさん:2011/12/08(木) 23:49:36.31
くだらない言葉遊びですね
オモシロクナイですよ、それ

575 :デフォルトの名無しさん:2011/12/08(木) 23:52:13.21
Simulaを侮蔑するのはやめろ!!!

576 :デフォルトの名無しさん:2011/12/08(木) 23:58:21.17
用語もまともに使い分けられんクズはJavaなりC#なりRubyなり巣にカエレ

577 :デフォルトの名無しさん:2011/12/08(木) 23:58:52.51
言葉遊びが面白くないのなら最初から正確な表現を心掛けるんだな

578 :デフォルトの名無しさん:2011/12/09(金) 00:02:23.76
>>575
SimulaはProcedureじゃん

579 :デフォルトの名無しさん:2011/12/09(金) 00:19:12.79
>>573
>メンバー関数のことをメソッドとは言わん。Javaみたいな恥ずかしいことを書くな。

しらんがな、MS に言ってくれよ。
http://msdn.microsoft.com/ja-jp/library/bb3b0dfs.aspx

580 :デフォルトの名無しさん:2011/12/09(金) 00:19:58.76
>>574
言葉以前に構造が全然違う。
メンバー関数は、関数と関数ポインターでしか無いが、
メッセージ&メソッドは、メッセージをキーに対応するメソッドを探し出す。
さらには、転送やら、未対応メッセージに対しデフォルトメソッド起動やら
高機能かつ重い。

581 :デフォルトの名無しさん:2011/12/09(金) 00:22:53.14
>>579 自己解釈だらけのMSなんか相手にすんなよ。
コンパイラからファイルフォーマットから余計な拡張ばっかしやがる
企業なんて追いかけても無駄。数年後にはまた用語が変わる。

582 :デフォルトの名無しさん:2011/12/09(金) 00:40:21.29
概念としてはほぼ同じと見れるし、
構造をはっきりと意識して使い分けるならば違うとも見れるわけだし、
目くじらたてる必要はないよな

583 :デフォルトの名無しさん:2011/12/09(金) 02:25:01.38
>>581
むしろMFCは変わってないからメソッドのままなんだよ。数年どころか20年間メソッドのままだよ
標準化されたところは標準の用語になってる

584 :デフォルトの名無しさん:2011/12/09(金) 03:16:26.48
「他の言語の言葉をここで使う必要は無い」
「とりあえず通じてるからいい」
系のレスを途中まで書いては見たものの、かなり低レベルなことに気付いて全部消した
おなかすいた

585 :デフォルトの名無しさん:2011/12/09(金) 07:35:34.29
>>583

引っ張りたくないが、ソースはどこだよ。
http://msdn.microsoft.com/en-us/library/f33y54z5(v=vs.80).aspx

用語なんてどうでもいいじゃんってのは、
「見た目が同じだから、クラスを全部構造体って言えばいいじゃん」
と言われるのと同じ感覚なんだが、言い訳しかしないしどうでもいいや、好きにすりゃいい。

586 :デフォルトの名無しさん:2011/12/09(金) 08:50:04.91
クラスと構造体はどこが違うの?
あおりじゃなくまじで教えて?

587 :デフォルトの名無しさん:2011/12/09(金) 08:59:07.19
>>580
ちげーよバカ
メソッドはオブジェクトのもつ手続きという以上の意味はない
C++のメンバ関数もメソッドで正解なんだよ
お前の言ってるメソッドはメソッドの実装の一つでしかないといことに気がつけモンキー


588 :デフォルトの名無しさん:2011/12/09(金) 09:31:55.67
class A{
private:

struct A{
public:

それぞれ、ブロックの最初にprivateとpublicが暗黙に書かれてると思えばおk

589 :デフォルトの名無しさん:2011/12/09(金) 09:34:06.75
>>586
まず、その「クラス」と「構造体」の定義をした方がいいと思うよ。
C++ の class と struct の話なのか、一般的なクラスと構造体の概念の話なのかで
答えが変わってくるから。

590 :デフォルトの名無しさん:2011/12/09(金) 09:36:03.13
構造体はクラスの一種

591 :デフォルトの名無しさん:2011/12/09(金) 11:28:12.70
>>586
知ってるくせに()

592 :デフォルトの名無しさん:2011/12/09(金) 12:19:36.98
たとえばIDを返すことを強要したい場合、以下のようにインターフェイスを設けるべきだと言われますが、
class IItem {
public:
  virtual ID GetID() const = 0;
  virtual ~IItem() {}
};

このような場合、分かりきっている実装は含めたほうがよくないでしょうか。
class IItem {
public:
  virtual ID GetID() const { return id; }
  virtual ~IItem() { id_.Release; }
protected:
  IItem(ID id) : id_(id) {}
private:
  ID id_;
};

また調べているうちにNVIパターンというものを知りました。
class IItem {
public:
  ID GetID() const { return DoGetID(); }
  virtual ~IItemA() {}
private:
  virtual ID DoGetID() const = 0;
};

他言語ではインターフェイスは純粋な仮想関数を含むクラスという制限がありますが
その制限のない、というかインターフェイスという概念のないC++において、実装を含むクラスをインターフェイスと呼べるのでしょうか。
またインターフェイスという仕様に沿うために、実装を完全に派生クラスに移譲する設計をしているのか、
基底クラスに実装を含めたほうがいいと考えられるようなものでも、あえてそうしない理由があるのか、教えてください。

593 :デフォルトの名無しさん:2011/12/09(金) 12:31:56.10
class ItemBase {
public:
virtual ~ItemBase(void) {}
ID GetID(void) const { return m_id; }
protected:
void SetID(ID id) { m_id = id; }
private:
ID m_id;
};

俺はこうしちゃうな


594 :デフォルトの名無しさん:2011/12/09(金) 12:54:07.73
インターフェースで定義してしまうとインターフェースを2つ継承してるときにちょっと困る時がある
http://codepad.org/Pdq237yc
http://codepad.org/prvKp2Ql
前にCOMの真似してvirtual AddRef/Releaseを使ってみようとしてハマった記憶があるよ
派生クラスにほとんど共通で書きなおすのがめんどい機能を提供したいなら
struct BasicFunctions {
ID GetID(void) const { return id_; }
void SetID(ID id) { id_ = id; }
private:
ID id_;
};

struct ItemEx : IItem {



595 :デフォルトの名無しさん:2011/12/09(金) 12:55:15.22
ID GetID(void) const { bf_.GetID(); }
private:
BasicFunctions bf_;
};

と書くといいよ

596 :デフォルトの名無しさん:2011/12/09(金) 15:09:51.43
いや、ほんと、ループって重い処理なんだね。
素数判定で思い知った。
目的のインデックスに達するまでループするのと
乗算やmodを使ってインデックスを直接割り出すのとで
対して速度違わねーだろと思ってたのに
10億回も呼び出されるとなると軽く1秒とか2秒の差になるのな^^

そりゃ、日本のゲームが海外のゲームみたいな
綺麗な画面、華麗な動き、活き活きとしたキャラクターを描けないわけだ。

597 :デフォルトの名無しさん:2011/12/09(金) 16:54:54.45
class HogeItem : public Item { ... };

class Foo
{
 virtual shared_ptr<Item> GetItem() const;
};

class Bar : public Foo
{
 // @
 virtual shared_ptr<HogeItem> GetItem() const { return this->pItem; }

 // A
 virtual shared_ptr<Item> GetItem() const { return this->pItem; }
 virtual shared_ptr<HogeItem> GetX() const { return this->pItem; }

 shared_ptr<HogeItem> pItem;
};

shared_ptrを戻り値としたばあい共変性が保てないんだな
@が無理だと知ったんだけど、Aの方法を取るしかないの?
あと、AのGetX(仮)関数の名前はどんなのがいいだろう?

598 :デフォルトの名無しさん:2011/12/09(金) 17:57:37.03
>>597
GetXはvirtualにする意味ないだろ


599 :デフォルトの名無しさん:2011/12/09(金) 18:33:02.52
インターフェースクラスをテンプレートクラスとして定義して
型を指定して継承って可能?

600 :デフォルトの名無しさん:2011/12/09(金) 18:51:46.28
可能

601 :デフォルトの名無しさん:2011/12/09(金) 19:30:27.36
抱きましたサンクス

602 :592:2011/12/09(金) 20:35:55.80
ありがとうございます。参考になりました。

603 :デフォルトの名無しさん:2011/12/09(金) 22:19:47.75
>>587
適当なことを言うな。ProcedureでしかなかったSimulaのVirtual Procedureに対し、
Message送信と処理が分離しており区別する必要があったSmalltalkが導入した語句だ。
Smalltalk, Objects, and Designでも買って読んでみろ。

604 :デフォルトの名無しさん:2011/12/09(金) 22:22:27.05
>>596
んな事をするバカは日本にも稀だ。
ループのコストについても履き違えてる。

605 :デフォルトの名無しさん:2011/12/09(金) 22:24:47.20
>>603
お前が馬鹿だろこのアンポンタン
言葉ってのは時代の流れに乗って変化していくものなんだよ
現代でメソッドっていったらオブジェクトの手続き部分以上の意味はない

606 :デフォルトの名無しさん:2011/12/09(金) 22:30:24.62
>>592
メンバーの実装強要は置いといて、
データメンバーの無い、仮想関数を持ったクラスは親に持っておくべき。
2個めの実装を持ったクラスをつくってもいいが、そのクラスは親に、
データメンバーの無いクラスを持っておいておいたほうがよい。

君のIItemを継承したクラスがidを必ずしも必要とするとは限らないからね。
IItemの子クラスが、メンバー変数に、IDを取得できるオブジェクトをもっていて、
IDをGetIDから返す際は、そのオブジェクトに問い合わせるって実装を作ったら、
IItemのidは死荷重になる。IDがポインタで表現されてるとかだと、大した量でも無いが、
GUIDみたいな物だと、IItemを配列に突っ込んだ時、死荷重の割合が増大する。

607 :デフォルトの名無しさん:2011/12/09(金) 22:34:01.41
>>605
お前はJavaでもRubyでもつかってろって
Smalltalkと対立関係があり、逆にObjective-C++として
近親関係でもあるC++だとMethodはSmalltalkと
Objective-CのMethodを指すんだよ。

608 :デフォルトの名無しさん:2011/12/10(土) 00:15:43.03
まぁあれだ。メンバ関数をメソッドと呼んだり、基底クラスをスーパークラスとか呼んだりする人は
Javaから流れてきた連中でたいていはとんでもないプログラムを書いてプロジェクトを荒らす^^
JavaとC++がまったく別物だということに無頓着なことが多い。弱る。

609 :デフォルトの名無しさん:2011/12/10(土) 00:23:12.66
>>596
活き活きを履き違えてるな。活き活きさせるにはループ内で迅速に関連変数を書き換えないといけない。で、描画する。
その根本の動作はモーションキャプチャで撮ってきてたりするが、
結局どのタイミングで関連変数を書き換えて反映するかの一点しかない。

動きというものがループで生成される画像の連続なんだぞ?

610 :デフォルトの名無しさん:2011/12/10(土) 09:08:34.50
既にメソッドと呼ばない言語の方がマイナーだ

611 :デフォルトの名無しさん:2011/12/10(土) 09:26:21.24
>>608
もういいから老人は放射能で早く死ねよ

612 : ◆QZaw55cn4c :2011/12/10(土) 11:02:51.05
>>608
new/delete が癌ですかね?それともポインタ?

613 :デフォルトの名無しさん:2011/12/10(土) 11:15:38.84
規格で決まってる名前なんだからしょうがないだろ。
C++にはメソッドとかスーパークラスなんて名称はない。
ちなみにメンバ変数なんてのもないし、戻り値なんてのものない。

…通じるからいいじゃん、という意見なら賛成だ

614 :デフォルトの名無しさん:2011/12/10(土) 12:06:20.30
何でfunctionよりmethodが使われるようになったのかね
戻り値の型がvoidなものもfunctionと呼ぶのが気持ち悪かったのだろうか

615 :デフォルトの名無しさん:2011/12/10(土) 15:55:15.52

bool型のポインタを返すfunc()という関数内で、ポインタの配列ptrを作成し、
同じくfunc()関数内で作成したaという配列のアドレスを代入しました。

その結果、「func ここから〜func ここまで」、を見る限りptrはaのポインタとなっているようです。

このfunc関数でptr[0]を返し、main関数内のmain_aに代入したところ、アドレスは一緒なのに何故か中身が全て0になってしまうのです。(bool型ということが関係しているようで、bool*をint*にするとmain_aでも正常にポインタとして機能してくれます。)

そして、質問なのですが、bool型でも*main_aを正しく表示させるにはどうしたらいいのでしょうか。
ソースと出力結果は次に書きます。


616 :615:2011/12/10(土) 15:56:21.12
-------------------ソース------------------------------
#include <iostream>
using namespace std;
bool* func(){
bool* ptr[5];
bool a[5]={1,0,1,1,0};
cout<<"func ここから"<<endl;
for (int n=0;n<5;n++){
ptr[n]=&a[n];//aのアドレスを入れる
cout<<"ptr: "<<ptr[n]<<" *ptr: "<<*ptr[n]<<endl;
}
cout<<endl;
for (int n=0;n<5;n++){
cout<<" &a: "<<&a[n]<<" a: "<<a[n]<<endl;//出力
}
cout<<"func ここまで\n"<<endl;
return ptr[0];
}
int main(){


bool* main_a;
main_a=func();

cout<<"main内"<<endl;
for (int n=0;n<5;n++){
cout<<"&main_a: "<<main_a+n<<" *main_a: "<<*(main_a+n)<<endl;//アドレスとその中身を出力
}
return 0;
}

617 :615:2011/12/10(土) 15:57:23.76
------------出力結果-------------------
func ここから
ptr: 002AF9AC *ptr: 1
ptr: 002AF9AD *ptr: 0
ptr: 002AF9AE *ptr: 1
ptr: 002AF9AF *ptr: 1
ptr: 002AF9B0 *ptr: 0

&a: 002AF9AC a: 1
&a: 002AF9AD a: 0
&a: 002AF9AE a: 1
&a: 002AF9AF a: 1
&a: 002AF9B0 a: 0
func ここまで

main内
&main_a: 002AF9AC *main_a: 0 //アドレスが一致しているのに値が異なっている・・・型がおかしい?
&main_a: 002AF9AD *main_a: 0
&main_a: 002AF9AE *main_a: 0
&main_a: 002AF9AF *main_a: 0
&main_a: 002AF9B0 *main_a: 0

連投すみませんがよろしくお願いします。

618 :デフォルトの名無しさん:2011/12/10(土) 16:02:11.43
main_aが参照しているのは関数内のローカル変数aなんだから
ローカル変数が破壊された後は、その中身がどうなってるかなんて
神の味噌汁だよ。

619 :デフォルトの名無しさん:2011/12/10(土) 16:02:42.28
ローカル変数のアドレスを返してるんだからおかしくなるに決まってる

620 :デフォルトの名無しさん:2011/12/10(土) 16:12:11.34
アセンブラやるといいよ

621 :デフォルトの名無しさん:2011/12/10(土) 16:17:04.05
int * func() {
 int a = 100;
 return &a;
} // この地点で変数 a は破棄される

なので、このようにして
int * b = func();
戻り値として取得した、"破棄された a" を指すポインタ b は何をさしているのか分からない

というか警告出ないのか?

622 :615:2011/12/10(土) 16:23:05.07
釣 れ ま く り

623 :デフォルトの名無しさん:2011/12/10(土) 16:29:09.76
最終的に実現したいのは任意の入れ子になったvectorの表示です。
とりあえず2次元からと思い、以下のコードを作りましたが何も表示せず終了してしまいます。問題点を教えてください。
再帰以外の手法でも構いません。

http://ideone.com/Z8vSR


と投稿しようとしたら、ideoneがエラー表示してくれてるのに気付いて(iが未初期化だった)ひとまず再帰での表示は解決しました。
なので、むしろ他の手法についてうかがいたいです。


624 :615:2011/12/10(土) 16:29:54.23
>>618-621
ありがとうございます!
なるほど。破棄されるんですね。警告はでませんでした・・・

破棄されないようにするにはstatic使えば大丈夫ですよね。


本題とは関係ないのですが、
なぜbool*を全部int*に置き換えてやった場合はmain内でもうまくいったのでしょうか?
たまたまですかねw

625 :デフォルトの名無しさん:2011/12/10(土) 17:08:27.56
>>623
同じ発想をちょっと整理してみたYO

#include <vector>
#include <iostream>
#include <memory>
#include <algorithm>
#include <iterator>

template< typename T, template< typename E, typename A = std::allocator< E > > class C >
std::ostream &operator <<( std::ostream &os, C< T > c ) {
for ( C< T >::const_iterator i = c.begin(); i != c.end(); ++i ) os << *i;
return os;
};

int main(){
using namespace std;

vector< int > v(3,1);
cout << "コンテナ出力" << v << endl;
vector< vector< int > > u(3, vector<int>(2,2));
cout << "入れ子ンテナ出力" << u << endl;
vector< vector< vector < int > > > w(3, vector< vector< int > >(2, vector< int >( 3, 3 ) ) );
cout << "入れ入れ子ンテナ出力" << w << endl;

}

626 :デフォルトの名無しさん:2011/12/10(土) 18:09:35.81
全くの初心者というか知識が全くないんですが
ウイルスの処理とか自分でしてみたいのと
ゲームとか作れるようになりたいんですが
どんな勉強をすればいいんですか?
高くてもいいんでおすすめの本とかを教えてくれると嬉しいです

627 : ◆QZaw55cn4c :2011/12/10(土) 18:37:33.97
>>626
ウィルス技術は本にはならないだろう。チェルノブイリウィルス(CIH) とかのソースはもしかすると手に入るかもしれない、win95/98/me限定だが。もっとも手が後ろに回る覚悟が必要。

628 :デフォルトの名無しさん:2011/12/10(土) 18:59:30.44
>>627
すいません
言い方がいけなかったです
ウイルス対策のソフトとかを使わないで自分のパソコンに入ってきた
やつをなんとかしたいだけです

あとパソコン自体に詳しくなりたいんですが
何を学べばいいかよくわからなくて
あとは上の通りです

629 :デフォルトの名無しさん:2011/12/10(土) 19:01:27.71
>>626
>ウイルスの処理とか自分でしてみたいのと

ウィルスを作りたいのか、ウィルスを処理するプログラムを作りたいのか?

いずれにしろ、>>627 の言うように公的な本はないと思う。

あと下記Q3〜6 あたりに目を通しておいた方がいいよ。
http://www.moj.go.jp/content/000073750.htm

630 :デフォルトの名無しさん:2011/12/10(土) 19:08:03.48
>>629
ああ、処理する方か。
何とかする方法は、ウィルス毎に違うからウィルス毎に対策するしかない。
個人では事実上無理だと思う。

金をかけたくないだけならフリーの物を入れればいいし、どうしても何とかしたいなら
VMWare / Virtual PC とかの仮想化ソフト上でいろいろやって、ウィルスに感染したら
がっさり捨てると言うのが現実的。

> あとパソコン自体に詳しくなりたいんですが

何のために? パソコンと言っても、いろんな要素があるから、方向ぐらい決めないと
誰もアドバイスできないと思うよ。

631 :デフォルトの名無しさん:2011/12/10(土) 19:20:17.02
>>629 >>630
ありがとうございます
>>630
何をやりたいとかというのが漠然としてまして...
というか
なんといったらいいかわからないというか
強いて言うならゲームとかを作ってみたいです
あとロボットとかのプログラミングとかをしたり
そういうことがしたいです

632 :デフォルトの名無しさん:2011/12/10(土) 19:30:03.20
>>631
とりあえず検索をすることを勧める

ゲーム プログラミング

これで検索してからにしな

633 :デフォルトの名無しさん:2011/12/10(土) 19:35:21.19
>>632
すまないありがとう

あと
聞きたいんですけど
イラスト用のソフトとかってどうやって作ってるんですか
これも
それを学べばできるようになりますか

634 :デフォルトの名無しさん:2011/12/10(土) 19:37:40.41
画像を扱うという点では共通した部分も少なくないと言えなくもない

635 :デフォルトの名無しさん:2011/12/10(土) 19:42:10.34
個人的には、ロボットとかの動くものの方が面白いと思う。

※ 個人の感想です。

636 :デフォルトの名無しさん:2011/12/10(土) 20:07:07.45
>>631
ゲームはプログラミングとしてあまりに広大な幅を持っているから、
どれからはじめれば・・・というのは悩み所だな
とはいえ成果が目に見てわかりやすい2d,3dプログラミングは楽しいと思う
glfw+OpenGLとか結構お手軽に始められるし。


637 :デフォルトの名無しさん:2011/12/10(土) 20:15:16.24
>>636
ありがとうございます

この二つは上はわかるような気がしますが
したのglfw+OpenGLというのが全くわからないです

おすすめのサイトや本などを教えてくれると嬉しいです

638 :デフォルトの名無しさん:2011/12/10(土) 20:15:37.29
ペイントレベルなら習作で作れると思う
GUIの入門書でも大体あると思う(全部にあるとは言わんが)

639 :デフォルトの名無しさん:2011/12/10(土) 20:15:52.97
とりあえずググれ

640 :デフォルトの名無しさん:2011/12/10(土) 20:22:03.31
>>633
GUIはC++だと敷居が高くなりがちだし、
C#あたりで始めたほうが挫折しにくいかと

641 :デフォルトの名無しさん:2011/12/10(土) 20:38:53.04
>>640
分かりました
じゃあまずそのC#っていうのから学んでみます
とりあえず本を買ってそれに沿って学んできます
少し調べたんですが猫でもわかるってやつでいいですかね

あと誰か>>636お願いします

642 :デフォルトの名無しさん:2011/12/10(土) 20:44:01.41
>>641
ググればどちらも一番上にあるぞ

643 :デフォルトの名無しさん:2011/12/10(土) 20:46:10.20
>>642
マジですか(-_-;)

644 :デフォルトの名無しさん:2011/12/10(土) 20:50:10.44
>>642
続けてすいません
glfw+OpenGLってググッたら一番上が英語で全くわからなかったです(-_-;)

645 :デフォルトの名無しさん:2011/12/10(土) 20:50:51.58
お前は個別に検索するとか一番上以外も見るとか
日本語のページを検索とかできないのかw

646 :デフォルトの名無しさん:2011/12/10(土) 20:53:09.30
>>645
個別ってどこできるんですか!?

647 :デフォルトの名無しさん:2011/12/10(土) 20:55:11.28
>>646
glfwとOpenGL別々に検索かけろよ
自分で調べる癖付けないとゲームつくろうなんて夢のまた夢だぞ

648 :デフォルトの名無しさん:2011/12/10(土) 20:58:46.97
>>647
すいません(-_-;)
+も普通に名前に含まれてて繋がってるのかと思ってました



649 :デフォルトの名無しさん:2011/12/10(土) 22:02:41.12
OpenGLの解説というとGLUTを使った説明だけで終わるサイトが多いのはなんでだ?
実用的なプログラム書こうとしたら、WGLまでおしえなきゃ如何だろ。
DirectXに人が流れる一因じゃないか?

650 :デフォルトの名無しさん:2011/12/10(土) 22:05:26.77
>>649
たのんだ

651 :デフォルトの名無しさん:2011/12/10(土) 22:14:03.63
ドザはお帰り下さい

652 :デフォルトの名無しさん:2011/12/10(土) 22:19:37.93
XならXGL、ツールキットがあるならそれのバインドインターフェース。
MacならCocoaでバインド。委細は違えど、どの環境でも要るだろ。

653 :デフォルトの名無しさん:2011/12/11(日) 06:07:02.85
>>625
おお……<<をオーバーロード!
シンプルで良いですね。ありがとうございます。
int以外を突っ込んだときの問題も解決されていてありがたい限りです。

654 :デフォルトの名無しさん:2011/12/11(日) 11:16:08.04
>>649
OpenGLはWindows以外で使われる事が多いし〜
WindowsならDirectX使う方が楽だし〜

655 :デフォルトの名無しさん:2011/12/11(日) 17:10:20.95
shared_ptrの最適化についてなんだが・・・

virtual void Hoge::Func()
{
 const boost::shared_ptr<Piyo> sp(this->pPiyo);
 Piyo* const p(sp.get()); // "ここ"

 p->SetX(1);
 p->SetY(3);
 p->Print();
}

上記の"ここ"がないとアセンブリが長くなるんだけど、なぜなんだ?

656 :デフォルトの名無しさん:2011/12/11(日) 17:37:58.57
boost::shared_ptrがoperator ->をオーバーロードしてチェックなどの処理をはさんでいるから。

657 :デフォルトの名無しさん:2011/12/11(日) 17:43:07.20
テンプレートは使わない部分は実体化されないってルールの帰結ですね。

658 :デフォルトの名無しさん:2011/12/11(日) 17:59:32.94
>>656
でもオーバーロードは
T * operator-> () const // never throws
{
 BOOST_ASSERT(px != 0);
 return px;
}
これだけで、BOOST_ASSERTは非デバッグ時に最適化で削除される
それでもshared_ptr::pxに関する最適化がされないものなの?

>>657
使われない部分は作成されないのは理解しているけど、>>655の例ではそれはどの部分ですか?

659 :デフォルトの名無しさん:2011/12/11(日) 18:12:07.27
じゃあオーバーロードされた関数がinline化されてないだけじゃね。
どのコンパイラ使ってるか知らんけどMSVCならデフォだとinline指定に関わらずinline展開するかどうかコンパイラが勝手に判断するし。

660 :デフォルトの名無しさん:2011/12/11(日) 18:14:52.99
100%インライン化されるからと言って
関数の実体が作られないわけじゃないんじゃないの
多重定義を防ぐために、オブジェクトファイル内で
多重定義があっても無視する属性を付与しておく必要があるだろうし

実験してみたらどうよ

661 :デフォルトの名無しさん:2011/12/11(日) 18:48:08.78
クラスの設計について質問したいんだが、
AってクラスとBってクラスがあります。
それぞれ、privateメンバとして、xとy座標を持っています。

BクラスからAクラスの座標を取得してあれこれしたい場合、
どういう設計が一番いいと思いますか?

思いついたのは、Aクラスの座標を静的メンバにして、
publicのstatic関数を作って、Bから取得する、という方法しか思いつきませんでした。

でもこれかなり変な設計な気がします。
何かアドバイス下さい。

662 :デフォルトの名無しさん:2011/12/11(日) 18:52:15.22
両方シングルトンにしてお互いにオブジェクトを持つと良いよ

663 :デフォルトの名無しさん:2011/12/11(日) 18:56:00.70
>>662
はぁ〜。なるほど。
頭いいですね。
ありがとうございました。

他にもいい方法があれば書いてくれると嬉しいです

664 :デフォルトの名無しさん:2011/12/11(日) 19:02:47.07
>>661
>BクラスからAクラスの座標を取得してあれこれしたい場合、

これがまずいような気がするんだが。

そのあれこれの処理をAクラス側に持たせるわけにはいかんのか?

できないなら素直にBに座標を読み出すメンバ関数作ればいいだけじゃないの?

665 :デフォルトの名無しさん:2011/12/11(日) 19:17:42.36
>>664
あれこれっていう説明が悪かったですね。
単純に座標を取得して、AとBとの角度を出したかったんです。

でもAとBは完全に独立したクラスなので、
それぞれのクラスをメンバとして持たせたくなかったんです。
第三のクラスを作って、そこからAとBクラスの座標を関数で取得して、
角度を計算することはできるんですが、それではその値は第三のクラスしか取得できません。
その角度をBクラス内で利用したかったので困ってました。

やっぱりこの場合はBクラスのメンバとしてAクラスのオブジェクトを持たせ、
そいつから関数呼び出して取得するしかないですよね。

何かお互いに独立したクラスなのに、お互いをメンバに持つのがなんか気持ち悪いんですよね。

666 :デフォルトの名無しさん:2011/12/11(日) 19:19:34.36
ついでにもう一つアドバイス下さい。
このAとBの当たり判定をする場合は、
第三のクラス内で当たり判定すべきか、それともA/Bどちらかのクラス内でするべきかどっちがいいと思いますか?

667 :デフォルトの名無しさん:2011/12/11(日) 19:34:49.92
>>659
コンパイラはvc2005。最適化に関する設定はデフォ
operator->自体のinlin展開はされているんだ。
ただ、>>655のとおり、sp->SetX(1) イコール p->SetX(1)にならない理由が知りたい

http://codepad.org/KeVHGvt0
"== Func4" と書かれているものは最適化の結果、Func4として展開されている

668 :デフォルトの名無しさん:2011/12/11(日) 19:35:40.67
別のクラスを作って座標を渡して結果を得るべき

669 :デフォルトの名無しさん:2011/12/11(日) 19:36:31.84
まったく抽象的でわからん話だが、
仮にクラスAをインベーダー、クラスBを砲台としよう^^

インベーダーと砲台の衝突判定は、砲台に聞けばいい。
「おまえはインベーダーと衝突しているか?」ってね。
砲台は各インベーダーに自分の位置情報を渡して
「おまえは俺と衝突しているのか?」と聞くに違いない。

情報を要求してはいけない。
情報を与え指示するのだ。

角度もそうだ。角度の情報を画面に表示するのでもなければ、
その「角度」は何か必要な動作のために「情報」に過ぎないはず。
情報を要求してはいけない。動作を指示せよ。

ぬんぱら。

670 :デフォルトの名無しさん:2011/12/11(日) 19:39:06.84
>>669
衝突判定は、弾にやらせた方がいいんじゃね?

671 :デフォルトの名無しさん:2011/12/11(日) 19:49:01.04
>>666
AとBの親クラスで当たり判定X::Conflict( a, b );

672 :デフォルトの名無しさん:2011/12/11(日) 19:50:47.53
衝突判定ライブラリとかだと
@ broad-phase で交差する可能性のあるペアを集めて、
A narrow-phase で物体同士の交差判定を行う

つまり、衝突判定は第3者が行う

673 :デフォルトの名無しさん:2011/12/11(日) 19:51:45.19
>>669
なるほど
すごい参考になりました。ありがとうございます。

>>668
座標を取得するところまでは、お互いのクラスをメンバとして持たせて取得するってことですか?
当たり判定は他のクラスの関数に座標を渡してやれってことですか?

ん〜もうちょっと考えてみます。

674 :デフォルトの名無しさん:2011/12/11(日) 19:55:37.52
>>671-672
なるほどー
やっぱり当たり判定は親クラスの方が良さそうですね。

当たり判定用の座標は親クラスからなら、
A/Bクラスのpublic関数を呼び出して取得できるので大丈夫そうです。

角度をBクラス内で利用するには、Aクラスのオブジェクトをメンバとして持たせるしかなさそうですね。

皆さんありがとうございました!


675 :デフォルトの名無しさん:2011/12/11(日) 20:09:54.29
>>667
いいから>>660実験してみたらどうよ

676 :デフォルトの名無しさん:2011/12/11(日) 21:00:14.35
>>675
e?実験する内容が分からないぞ。具体的な実験内容を教えてくれ
最適化した後はoperator->(のオーバーロード)のcallは見つからないのは確かだが

677 :デフォルトの名無しさん:2011/12/11(日) 21:19:22.96
>>674
当たり判定して何したいの?
衝突したいだけなら、判定単品はいらないと思うけど。

double 弾.衝突( 障壁[i] );
double 衝突( 障害物 &障害物 )
{
      // 判定から、衝突の振る舞いまで、障害物にまかせる。
      ベクター += 障害物.破壊衝突( 衝撃量 , this->座標 );
      return ベクター.ノルム();
}

678 :デフォルトの名無しさん:2011/12/11(日) 21:20:24.59
>>670
シューティングゲームだったら弾じゃなくて機体のほうがいいと思う
空間登録と1つに対する判定のコストは平均して定数とすると弾と機体の数がそのまま計算コストのオーダーになる
ふつうは弾のほうが多いから弾で判定するのは良くないだろう(まあ弾同士がぶつかるとかだとどっちみち必要だけど)

679 :デフォルトの名無しさん:2011/12/11(日) 21:20:35.86
>>676
それはインライン化された事を確認しただけ
インライン化されたものとは別に、
インライン化されていない関数の実体が存在するかチェックすべし

680 :デフォルトの名無しさん:2011/12/11(日) 21:22:36.87
手で書ける程度の有限個の定数だったら
switchをifで書いてもぜんぜん差はないよね?


681 :デフォルトの名無しさん:2011/12/11(日) 21:25:08.33
>>678
マジレスしてくれてありがとう。
でも、今の話には弾は関係なかったりするんだな。

インベーダーと砲台の関係なので。

682 :デフォルトの名無しさん:2011/12/11(日) 21:45:06.05
>>680
switch で書ける物は
switch で書いた方が可読性は高いと思うよ
1つの変数の値で分岐してるんだな、というのが一目でわかるので
プログラムは人間も読む物なので、文脈も考えて書くと良いよ

683 :デフォルトの名無しさん:2011/12/11(日) 21:53:48.72
>>680
測ってみりゃいいのに。

684 :デフォルトの名無しさん:2011/12/11(日) 21:57:26.64
switchでかける個数に限界があるから気を付けたほうがいい

685 :デフォルトの名無しさん:2011/12/11(日) 22:07:28.51
if-elseも限界あるぞw

686 :デフォルトの名無しさん:2011/12/11(日) 22:13:28.23
>>684
マジで。switchなんか殆ど使わんから初めて知った。
256個ぐらいか?

687 :デフォルトの名無しさん:2011/12/11(日) 22:29:49.11
視認性的な意味のような気がする。あれは基本、スコープ付きgotoだし。

688 :デフォルトの名無しさん:2011/12/11(日) 22:32:01.11
関数ポインタの配列

689 :デフォルトの名無しさん:2011/12/11(日) 22:57:00.28
別にgotoじゃねぇよ。
処理スタックを下降はできても遡れるようには出来てない。
処理スタックを破壊するgoto化しないように制限は掛けてある。

690 :デフォルトの名無しさん:2011/12/11(日) 23:52:00.86
switchのcase文ごとにスコープにならないのが不快

691 :デフォルトの名無しさん:2011/12/12(月) 00:42:23.56
boolをcharにキャストしようとしてもできないんだけどこれは仕様?

692 :デフォルトの名無しさん:2011/12/12(月) 00:48:51.78
ttp://codepad.org/pV1Q5ql5
エラーメッセージは?

693 :691:2011/12/12(月) 00:51:26.24
ミスって書きこんでしまいました。さーせん

bool型のをchar型に変換してprintfで出力したらおかしくなったんだけどどうにかならないですかね。

int main(){
bool a=1;
printf("%c",(char)a);
return 0;
}

出力: 』 が上下逆転したような文字が・・・

もしかしてcharの1(%c での1)って%dの1じゃないってことですかね?(わかりにくくてすみません)

694 :デフォルトの名無しさん:2011/12/12(月) 00:56:39.29
int i = 1;と
char c = '1';は違うってことはわかるよね?

695 :デフォルトの名無しさん:2011/12/12(月) 00:59:36.04
>>694
やっぱ違うんですか・・0~9の数字は一緒だと思ってましたw

boolの1をキャストしてcharでも1と表示させるにはどうすればいいですかね

696 :デフォルトの名無しさん:2011/12/12(月) 01:05:56.72
ttp://codepad.org/sREkV689
1と表示するだけならこれだけでいいだろ
charでもっていう意味がわからない
数値の1を文字の'1'にしたいってことか?

697 :デフォルトの名無しさん:2011/12/12(月) 01:09:56.71
>>696
レスさんくす!

それがprintfではなくて、文字を描画する関数に渡すのでchar型にしないといけないんです。おうふ。

698 :デフォルトの名無しさん:2011/12/12(月) 01:12:43.99
ttp://codepad.org/e0LnV7ry
sprintfは覚えといたほうがいい

699 :デフォルトの名無しさん:2011/12/12(月) 01:34:48.05
>>697
これで変換できるハズだが。
char ToChar(bool n)
{
    return '0' + n;
}

700 :デフォルトの名無しさん:2011/12/12(月) 01:42:41.15
>>698
ありがとう!!

今アドバイス通りsprintfでやっていたんですが、

int main(){

bool b[5]={0,1,0,1,1};
char c[5]="";
for (int i=0;i<5;i++){
sprintf_s(&c[i],'1', "%d", b[i]);
}

printf("%s",c);
return 0;
}

これでやっていたらコンパイルはできてもエラー
(Debug Error! Run-Time Check Failure #2 -Stack around the variable 'b' was corrupted)

がでてしまって停止してしまいました。
結構色々見直したつもりなのですが、何がだめなのでしょうか。。(調べてもわかりませんでした。)

bがイったってのはわかるのですが、それがどういう原因によるものなのかがわからなかったので知恵を貸して下さい。
(何度もすみません)

701 :デフォルトの名無しさん:2011/12/12(月) 01:49:09.53
関数の前方宣言はこうじゃないか?
size_t sprintf_s(char[], size_t, const char[], ...);
どう頭で解釈してんだ?

const size_t length = 100;
char buffer[length];
bool value = false;

sprintf_s(buffer, length, "%d", value);
単に型合わせればこんな感じだろ。

702 :デフォルトの名無しさん:2011/12/12(月) 02:18:35.33
>>701
レスありがとう

boolの配列をcharに組み込みたく、
最初はfor内で

sprintf_s(c[i],1,"%d",b[i])でやってたのですが、

c[i]に下線でエラー(sprintf_sの引数リストと一致しません)ってでたので、
&にしたら直ったのでそのままやってました・・

boolの配列をcharに処理したいです。

703 :デフォルトの名無しさん:2011/12/12(月) 07:35:01.96
>>699 で1個1個変換して
最後にヌル文字つけれ

あと文字コードについて勉強すれ

704 :デフォルトの名無しさん:2011/12/12(月) 08:07:41.76
コンストラクタって、
static CLASSA a;

ってやっても実行されない?
つまりシングルトンにしたクラスって、
コンストラクタ実行できないの?

705 :デフォルトの名無しさん:2011/12/12(月) 08:21:07.32
そんなわけねーだろ

706 :デフォルトの名無しさん:2011/12/12(月) 08:21:59.24
最初に使われる前にコンストラクタが一回だけ呼ばれる

707 :デフォルトの名無しさん:2011/12/12(月) 08:22:23.27
>>704
静的メンバ変数 初期化
でぐぐれ

708 :デフォルトの名無しさん:2011/12/12(月) 08:53:27.22
>>705-707
ありゃと

709 :デフォルトの名無しさん:2011/12/12(月) 10:30:40.13
char *data = 'xxxxx';

char *hage()  {
  return data;
}

void main()  {
  char *r = hage();
  printf(r);
}

こんな風でポインタを戻す関数を利用できると思いますけど、ポイントを引数で戻してもらうことできないでしょうか。

char *data = 'xxxxx';

void hage(char *result)  {
  result = data;
}

void main()  {
  char *r;
  hage(r);
  printf(r);
}

という風で出来かなと思いましたが、うまくいきません。

710 :デフォルトの名無しさん:2011/12/12(月) 10:47:14.61
'
"


711 :デフォルトの名無しさん:2011/12/12(月) 11:38:26.49
char *data = "xxxxx";

void hage( char **result) {

*result = data;

}

void main() {

char *r;
hage(&r);
printf(r);

}


712 :デフォルトの名無しさん:2011/12/12(月) 11:46:47.46
今時、void mainでコンパイル必須ってあるのか?

713 :デフォルトの名無しさん:2011/12/12(月) 13:29:30.57
*を二つですか!
どうもありがとうございました

BASICからだと、アドレス渡しって点がムズイです。。

714 :デフォルトの名無しさん:2011/12/12(月) 15:00:59.86
一件知りたいことがあります。力添えをお願いします。 (visual c++もc++もlinuxも経験が浅いです。)
visual c++でXMLを使いたかったため、windows用のlibxmlというライブラリを落として中身みると、
 (1)bin/libxml2.dll (964KB)
 (2)lib/libxml2.lib (369KB)
 (3)lib/libxml2_a.lib (3026KB)
 (4)lib/libxml2_a_dll.lib (3027KB)
というファイルが入っていました。
(3)と(4)はどういったものですか?ファイル名のサフィックスからわかりますか?

(2)をリンクすると、(1)のdllが使われるようです。
少し調べ、挙動的には(2)をインポートライブラリ、(1)を(2)に対応する動的リンクライブラリというものだろうと考えました。

(3)と(4)は、無くても動きました。
(3)について、ファイル名でぐぐると、単体で使われていることもあり、〜aの名前的にも(3)が静的リンクライブラリかと考えました?
そのため、単体でリンクしてみましたが、「error LNK2005: _printf は既に LIBCMTD.lib(printf.obj) で定義されています。」のようなエラーが出たため、考え違いのようです。
いま、英語圏をぐぐっているのですが、あまり英語が堪能ではなく、困っています。

以上、この件で私に不足していると考えられる知識をご存知であれば、御教示お願いします。

715 :デフォルトの名無しさん:2011/12/12(月) 15:03:11.84
>>714
スレ違い。環境依存OKスレでどうぞ。

716 :714:2011/12/12(月) 15:10:46.88
>>715
環境依存OKスレは、現在994で、埋め立て中です。
また、類似スレが多いために、後継スレは作らないとのことです。

717 :デフォルトの名無しさん:2011/12/12(月) 15:13:50.56
GCCスレかMinGWスレじゃない?

718 :714:2011/12/12(月) 15:28:55.45
>>717
ありがとうございます。
そちらで出直します。

蛇足ですが、_a_dll.lib というのは、ファイル名の規則かと思ったのですが、libxmlのローカルな表現のような気がしてきました。

719 :デフォルトの名無しさん:2011/12/12(月) 17:42:50.11
複数の型の違う引数を関数に入れたいのですが可能ですか?

出来るのでしたら書式を教えて下さい

720 :デフォルトの名無しさん:2011/12/12(月) 17:53:45.43
日本語でおk

721 :デフォルトの名無しさん:2011/12/12(月) 18:06:05.70
int A(){

}

の()にint型とstring型の引数を入れることは出来ますかという意味です

722 :デフォルトの名無しさん:2011/12/12(月) 18:07:43.12
無理

723 :デフォルトの名無しさん:2011/12/12(月) 18:10:12.15
int A(int p1, string p2);でおk

724 :デフォルトの名無しさん:2011/12/12(月) 18:37:41.90
>>721
int A(int i);
int A(const string& s);

の両方を宣言して両方を実装すればOK

725 :デフォルトの名無しさん:2011/12/12(月) 18:58:21.63
enum ARG_TYPE {
INT_TYPE, STRING_TYPE
};

int A(ARG_TYPE argType, int intValue, string stringValue) {
switch(argType) {
case INT_TYPE:
// intの処理
break;
case STRING_TYPE:
// stringの処理
break;
default:
// error
assert(false);
}
};


726 :デフォルトの名無しさん:2011/12/12(月) 21:42:59.81
>>725
内容はどうでもいいが列挙型を大文字で書くな。CとC++のタブーだろうが。

727 :デフォルトの名無しさん:2011/12/12(月) 22:22:24.54
setting.iniってのを作って、その内容を、

55 %int Aに代入
7 %int Bに代入
12.6 %double C

上のような感じにして、%以下からその行末までをコメントアウトとしたいです。

このファイルをプログラム起動時に読み込み、コメントのように代入するにはどうしたらいいですか。
使っているのはC++です。 よろしくお願いします。

728 :デフォルトの名無しさん:2011/12/12(月) 22:22:52.06
Windows.h に対する徴発と受け取りました。

729 :デフォルトの名無しさん:2011/12/12(月) 22:30:58.22
>>727
よく解からんな。特に2点。

1. iniと書いてるけどオリジナルフォーマットだろ。
2. 行頭に読み込む値があるだけか?

ただこれだけだったら、std::fstreamのreadで全部読み込んで、
1文字(バイトに非ず)ずつ確認して切り落とせば済むだろうけど。
何をしたいのかがいまいち解からん。

730 :727:2011/12/12(月) 22:42:15.17
>>729
さんくす

1,iniにした意味は、txtよりも設定のちょっと大事なファイルとして他人に意識してもらいやすいかなと思ったので。

2,はい。行頭だけです


行頭の値を読み込むのはなんとかわかったのですが、

読み込んだあと、次の行に移るという動作をするにはどうすればいいいのでしょうか。

また、%まで来たら次の行に移るにはどういう方法が考えられますか。
よろしくお願いします。


731 :デフォルトの名無しさん:2011/12/12(月) 22:47:17.71
個人的にはコンフィグは.cfgがいいと思うなー。

732 :デフォルトの名無しさん:2011/12/12(月) 23:06:23.53
>>727
FILE* fp = fopne("setting.ini", "r");
char line[256];
int A, B, C;

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &A);

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &B);

fgets(line, sizeof(line), fp);
sscanf(line, "%d", &C);

fclose(fp);

ぜんぜんC++じゃないけど。

733 :デフォルトの名無しさん:2011/12/12(月) 23:12:03.54
.ini は INI ファイルのフォーマットに従って書かれないと混乱するよね
.config は XML のイメージあるし、
.cfg はいい落としどころかもね

734 :デフォルトの名無しさん:2011/12/12(月) 23:16:44.33
>>732
sscanf使うぐらいなら、fscanfだっけ?あれ使えば?

const char *format = "%d%*[^\n]";
fscanf( file, format, &a );
fscanf( file, format, &b );
fscanf( file, format, &c );


735 :デフォルトの名無しさん:2011/12/12(月) 23:26:03.65
C++らしく書こう

#include <fstream>
#include <sstream>
#include <string>

template<typename T>
void get_value(std::ifstream &file, T &value){
std::string line;
if(std::getline(file, line)) std::istringstream(line) >> value;
}

int main(){
int A;
int B;
double C;

if(std::ifstream file = std::ifstream("setting.ini")){
get_value(file, A);
get_value(file, B);
get_value(file, C);
}
}

736 :デフォルトの名無しさん:2011/12/12(月) 23:27:21.70
>>734
scanf()系はエラー処理が面倒な感じで普段使わないからフォーマット文字列とか
エラーのときの挙動とかよく憶えてないんだよね。

737 :デフォルトの名無しさん:2011/12/12(月) 23:28:28.16
>>736
戻り値で成否数えて、バッファクリアするだけじゃん。

738 :デフォルトの名無しさん:2011/12/12(月) 23:41:07.94
>>737
今回みたいに行単位ならいいけど、そうでなかったら面倒じゃない?
なんか簡単な方法あるのかな。

あと、たとえばscanf("%d %d",・・・) とかやってて、オーバーフローのエラーチェックが必要ですってことになって、
fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。

739 :727:2011/12/12(月) 23:45:49.53
>>731>>733
なるほど。iniにフォーマットあるとは知りませんでした。
cfgにさせてもらいます。

>>732
ありがとうございます!
ちなみにこれ、次の行に移る処理はどこで行っているのでしょうか。sscanf()?

>>735
C++でありがとうございます!
C++のが若干面倒くさそうなんですね。
get_value関数内のgetline()の終了で次の行に移るんですかね。この辺の理解が足りてません、、、ぐほう

template<typename T>も分からないので調べてきます。



740 :デフォルトの名無しさん:2011/12/12(月) 23:47:43.53
>>739
ファイルポインタは独自に現在地を保持してて、それの挙動をわかった上でその書き方になる。

741 :デフォルトの名無しさん:2011/12/12(月) 23:51:43.28
>>738
>fgets()とstrtol()の組み合わせに変更したら挙動が変わっちゃうけど、最初からfgets()とsscanf()だったら、
>strtol()とかで自前でパースするようにしても、ストリームの消費の挙動は変化しないし。

ごめん解るようで言いたいことがよく解からん。

742 :デフォルトの名無しさん:2011/12/12(月) 23:52:00.63
>>739
>次の行に移る処理はどこで行っているのでしょうか。

fgets()を呼ぶたびに、一行、次の一行って読み込まれる。

743 :デフォルトの名無しさん:2011/12/13(火) 00:00:42.74
>>741
scanf("%d %d")だと、
「99 100」と一行で入力しても
「99
100」と二行で入力しても同じように動くけど、
これをfgets()に変更して同じ挙動を再現するのって大変じゃん。
あと、エラーがおきて一行クリアとかやってると、上のは二つともクリアされるけど
二つ目はひとつしかクリアされないとか。
細かいことは忘れたけど、scanf()系はいろいろ考えることがあって、テキストの入力はシンプルに
行単位か文字単位を使うことにした。

744 :727:2011/12/13(火) 00:06:41.29
>>740
ほうほう
>>742
そうだったんですか!!よく分かりました!ありがとう!!

同じ行で%以下を読み込まないようにするには
ttp://homepage1.nifty.com/emil/stream.html
上のページにあるように、

basic_istream& getline(char* buf, int size, char term)

を使ってchar termに ' % ' を渡すだけですよね?

745 :デフォルトの名無しさん:2011/12/13(火) 00:15:27.39
>>744
それだめなんじゃない?
「次の読み込は終端記号の次の文字から始まる」ってあるから
%まで読んで、次にgetline()呼んだら%の次から読み込まれそう。

746 :デフォルトの名無しさん:2011/12/13(火) 00:38:01.41
一行読んでから
% を検索してそこで文字列を打ち切れば良い

747 :デフォルトの名無しさん:2011/12/13(火) 00:52:12.46
>>745
は!確かに。。。

>>746
そうすることにします。ありがとうございます。


読み込み位置の指定で次の行にしたいと思い、
さっきのページで、termまで読み飛ばす関数、
ignore(int n, char term)をみつけたので、このtermを '\n' にすればいいですかね。

他にも何か次の行に移るよさげなやり方があればお聞きしたいです。
普通はignoreはそんなに使わないんですかね。

187 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)