1 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:29:45 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sageは禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.36【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1175436073/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
116 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:38:43 ] >>重複インクルードが問題なのではなく、同じ関数が複数リンクされることが問題。 >>理解できていないなら、無理にレスしなくていいからね。 だから、「同じ関数が複数リンク]されない方法があるって言うとんじゃ、阿呆かいな。 それとも、ホンマの初心者か?
117 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:46:42 ] そういう方法があるんかしらんが、>>114 では何の解決にもなってない。
118 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:48:08 ] >>116 >「同じ関数が複数リンク]されない方法がある だったらそれを書き給え。 尤も、それならそれで>114の「関数の重複インクにならんやり方」は 一体全体なんなのかという疑問は残るが。
119 名前:≠114 mailto:sage [2007/05/14(月) 17:51:13 ] >>118 これでOK。 --a.h #ifdef NEED_FUNC void func() {} --a.c #define NEED_FUNC #include "a.h" --b.c #include "b.h" -- ただし、これをインクルードガードとは言わないと思う。
120 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:53:03 ] それだとa.cでfuncが使いたいときに困るだろ。
121 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:54:27 ] 114のインクファイル中の記述で、ちょっと工夫したら(ヒントは関数の定義じゃ)できると言うとんじゃ。 これだけ言うたら、普通のC言語1年坊主でも気が付くど。気が付かんようなら、C諦めた方がええで。 それより、こんなレベルで初心者を教えるな! 初心者も迷惑じゃ。 >>だったらそれを書き給え。 誰に向かって言うとんじゃ、ボケ。
122 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:55:50 ] すみません、喧嘩しないで頂けますか?
123 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:56:24 ] >>121 分からなくても別に誤魔化さなくていいよ。 俺だって分かんないんだもん。
124 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:58:28 ] まだわからんか? そもそも”関数名”て何や?
125 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:58:51 ] まさかstaticを付けるというオチでは・・・
126 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:59:44 ] void foo ( ナンたらこたら… ↑で "foo" は何をしとるんや?
127 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:00:37 ] #define foo ↑で foo は何をされとんねん?
128 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:00:44 ] >>121 もちろんその方法では、 * a.h に関数の実装を記述する。 * a.c, b.c でインクルードすればどちらからでも使える。 * 関数は重複してリンクされない。 が満たされるんだよな。
129 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:01:33 ] >>127 焦らさないでくれよ
130 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:01:36 ] 当たり前だのクラッカ
131 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:02:38 ] もったいぶっちゃって、どうせそんな方法ないんだろ・・・
132 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:05:42 ] void foo ( なんたらこたら … void bar (ああでもこうでも … #ifndef foo printf ( "宣言済み" ) #else printf ( "未宣言" ) #endif … これでもわからんか?
133 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:07:29 ] void foo ( なんたらこたら #undef foo int foo ( ああでもないこでもない これではどや?
134 名前:≠114 mailto:sage [2007/05/14(月) 18:08:42 ] staticつけても同じ(内容の)関数が複数リンクされることには違いないしなぁ。 双方のソースから同じ名前で参照される別物の関数と言う条件だと、 どうにもならない気がしてきた。 >>132 まさかとは思うけど、関数を定義したかどうかをディレクティブで 判定できるなんて思っちゃいないよね? そろそろ正解をどんと出してみてよ。
135 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:08:47 ] 訂正 誤:int foo ( ああでもないこでもない 正:int foo ( ああでもないこうでもない
136 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:09:19 ] >>133 俺頭悪いからわかんないんだって・・・ 意地悪しないで教えてくれよ
137 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:12:58 ] わかった。リンカディレクティブだッ(w
138 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:15:32 ] 静的メンバ関数として実装するとか? struct HOGE_unique{ static int hoge() { ... } }; #define hoge Hoge_unique::hoge
139 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:17:24 ] もはやCじゃないがな
140 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:19:45 ] // aaa.h #ifndef test int test(int i){return i + 10;} #endif // bbb.c #include "aaa.h" int test ( int i ); int foo(int i){return test(i)+10;} // main.c #include <stdio.h> #include "aaa.h" void foo(int i); int main(void){printf("%d",test(i)+foo(i);}
141 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:23:16 ] 只今>>133 は>134を読んで真っ青になっている最中です。 次の御託を思い付くまでもう暫くお待ちください。
142 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:23:51 ] ↑アホ
143 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:30:33 ] >>137 ttp://sund1.sakura.ne.jp/uploader/source/up5445.mp3
144 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:32:28 ] >>140 こんなふうにプリプロセスされました。 // main.c #include <stdio.h> int test(int i){return i + 10;} int foo(int i); int main(void){printf("%d",test(1)+foo(1));} // bbb.c int test(int i){return i + 10;} int test ( int i ); int foo(int i){return test(i)+10;}
145 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:34:23 ] >>140 testなんかどこで#defineしてるの?
146 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:35:01 ] test は何回定義されとるん?アセブルリスト見てみ?
147 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:36:30 ] >>145 宣言されとらんから次のtest()がインクルードされるねんやんかいな。
148 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:39:30 ] トリッキやよって別々ライブではとおらんけどな。 わしが言いたいのんは「決めつけんな」ちゅうこと。
149 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:40:53 ] $ gcc -c main.c bbb.c $ nm main.o 00000000 b .bss 00000000 d .data 00000000 r .rdata 00000000 t .text U ___main U __alloca U _foo 0000000b T _main U _printf 00000000 T _test $nm bbb.o 00000000 b .bss 00000000 d .data 00000000 t .text 0000000b T _foo 00000000 T _test どう見ても両方にtestが含まれてるんだが
150 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:41:22 ] つまり、関西弁のような発言に見えるからと言って、関西人だと決めつけるな、ということですね?
151 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:42:26 ] ↑そうそう。 それと、gcc はバカやよって別別オブジェ作るねん。
152 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:43:00 ] なんだ、もう少し笑わせてくれるのかと思ったら意外に伸びなかったな。がっかりだぜ。
153 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:43:09 ] ようするにはったりだったわけだろ
154 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:44:08 ] 違うやろ、call _test のアドレス見れ
155 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:49:46 ] char line[] = "abcde¥012345¥0ABCDE"; みたいなことやりたいんですが、 '¥0'があるために、 lineの中身は"abcde¥0"となってしまいます。 当たり前と言えば当たり前なんですが、 回避方法はあるでしょうか。 '¥0'を含む長いchar配列を、 classのstatic constメンバ変数として持たせたいんです。
156 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:50:49 ] >>155 > lineの中身は"abcde¥0"となってしまいます。 どうやって確認したんだよ。 ちゃんと最後まで入っているはずだ。
157 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 18:51:27 ] 初心者アドバイザは、今、それどころやありません。
158 名前:154 mailto:sage [2007/05/14(月) 18:52:42 ] 「長いchar配列」というのは、数万文字あります。 なので、配列長を確保してから1つずつ代入というのは厳しい。 そんなもん別のテキストファイルにして必要なときに読めよ、 という以外のでお願いします。
159 名前:155 mailto:sage [2007/05/14(月) 19:02:58 ] #include <iostream> using namespace std; int main() { char line[] = "abcde¥012345¥0ABCDE"; for(int i=0; i<18; i++){ cout << "(" << line[i] << "," << (int)line[i] << ")"; } // i return 0; } $ ./a.out (a,97)(b,98)(c,99)(d,100)(e,101)( ,10)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0)(,0)(,0) となります。
160 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:05:13 ] >>159 コンソールで確認するなよ・・・
161 名前:155 mailto:sage [2007/05/14(月) 19:07:45 ] > lineの中身は"abcde¥0"となってしまいます。 は不正確でした。すみません。 "12345"の"12"が改行コードLF=10になっています。
162 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:08:43 ] >>159 char line[] = "abcde\0" "12345\0" "ABCDE"; こうしとけ。
163 名前:155 mailto:sage [2007/05/14(月) 19:10:14 ] >>160 あれ?なんかまずかったですか? 見やすいかと思って。 i=15, 16, 17のときに(,0)となってるので、 ここに何も入ってないんですよね。 なんで"¥012"が"¥0¥n"に化けてしまうのか。
164 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:12:28 ] "\012" が {'\0', '1', '2'} ではなく {'\012'} とみなされてるんだから、 配列の全長が2文字分みじかくなってる。 つまり最後の二つの0は不正なアクセス。
165 名前:155 mailto:sage [2007/05/14(月) 19:12:35 ] >>162 その方法で、 (a,97)(b,98)(c,99)(d,100)(e,101)(,0)(1,49)(2,50)(3,51)(4,52)(5,53)(,0)(A,65)(B,66)(C,67)(D,68)(E,69)(,0) になりました。 ありがとうございます。
166 名前:155 mailto:sage [2007/05/14(月) 19:13:53 ] >>164 ああ、octで解釈されてるわけですか。 なるほど。
167 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 19:24:34 ] >>159 みたいに for(int i=0; i<10; i++){ } // i とか if(hoge){ } // if っていう書き方を推奨してる本って、 なんかありませんでしたっけ? この書き方をどっかで読んだ記憶があるんです。
168 名前:54 mailto:sage [2007/05/14(月) 21:52:47 ] >>55-58 class A { int a; public: A(int i) : a(i) {} A& geta() { return *this; } virtual void prt() const { printf("a:%d\n", a); } }; class B : public A { int b; public: B(int i) : A(0), b(i) {} virtual void prt() const { printf("b:%d\n", b); } }; int main() { B b(100); b.geta().prt(); } これを動かすと「b:100」と表示されて、geta()はA&を戻す筈なのに実際は B&を戻している訳ですよ。B&を返すメソッドを勝手に定義してくれたほうが よっぽど自然だと思うんですが、私が愚かしいこと言ってるんですかね?
169 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:21:23 ] うん、けっこう愚かしいと思うよ…。
170 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:25:34 ] >>168 が理解できない どこでB&を戻してるの?
171 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:28:25 ] >>168 class C : public B { public: A& geta() { static A a(0); return a; } //コンストラクタほか省略 }; このとき、こうされたらどうする? C c; B& b = c; b.geta().ptr(); B型の式に対してgeta()を呼ぶとB&が返ってくることにしたら、 このb.geta()ではA型のインスタンスへの参照を返しているので型システムを侵すことになる。 だから暗黙的にやらないで、B内ではB&を返すgetaを明示的にオーバーライドしてやったほうがいい。 次のコードはC::getaでコンパイルエラーになる struct A {virtual A& geta();}; struct B : A {virtual B& geta();}; struct C : B {virtual A& geta();};
172 名前:171 mailto:sage [2007/05/14(月) 22:30:14 ] すまん 168のgetaも仮想関数だと思い込んでいたorz
173 名前:デフォルトの名無しさん [2007/05/14(月) 22:41:55 ] とあるソースを読んでいる初心者です. クラスClass1のヘッダファイル先頭に,下記のように他のクラスClass2,Class3の記述がありました. #ifndef ******* #include ************ class Class2; class Class3; ←これ class Class1 public 以下略 これはいったいどういう意味を持つのでしょうか?
174 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 22:57:07 ] Class2, Class3は別のところでちゃんと定義されてますよ ってコンパイラに教えるためのおまじない
175 名前:54 mailto:sage [2007/05/14(月) 22:58:24 ] >>171 なるほど。そのとおりでした。 サンクス。
176 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 23:01:02 ] >>173 試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ たぶんエラー吐くから
177 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 02:58:46 ] >>168 そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは すべて下位クラスで再定義する必要がある。 ('return *this' だけのメソッドは特別なんていうルールを採用する?) ちなみに、以下のようなプログラムではどんな結果になるべき? void prt3(A* obj) { printf("prt3(A)\n"); } void prt3(B* obj) { printf("prt3(B)\n"); } class A { public: A() {} virtual void prt() const { printf("A::prt\n"); } void prt2() const { printf("A::prt2\n"); } // thisの型はA?,B? return時だけB? A& geta() { prt(); prt2(); prt3(*this); return *this; } }; class B : public A { public: B() {} virtual void prt() const { printf("B::prt\n"); } void prt2() const { printf("B::prt2\n"); } }; int main() {B b; b.geta(); } 結果 B::prt ?::prt2 prt3(?)
178 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 03:35:58 ] *thisをthisにしてVC2003でコンパイル 結果: B::prt A::prt2 prt3(A)
179 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 18:49:47 ] VS2005,XPです。 HWND hwnd; RECT rc; GetWindowRect(hwnd,&rc); if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION)) うまくいかないのですが、こういう比較の仕方は使えないのでしょうか? 使えない場合、どのように直せばいいですか?
180 名前:デフォルトの名無しさん [2007/05/15(火) 19:33:30 ] クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか? int型の変数を24と8ビットに分けて使うような x.aは24bit x.bは8bit として使いたいんですが
181 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:33:42 ] >>17 D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、 Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、 そうできるようにしなかった理由が書かれている。
182 名前:180 [2007/05/15(火) 19:34:31 ] 代入、参照が普通の変数のように出来る方法を教えてください
183 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:35:55 ] >>180 どうしてもやりたいなら、ビットフィールドがその目的に使える。 但し、移植性を大きく損なうことになりかねないので注意。
184 名前:デフォルトの名無しさん [2007/05/15(火) 19:40:06 ] >>183 サンクス!!!
185 名前:デフォルトの名無しさん [2007/05/15(火) 19:59:46 ] >>183 すみません boolとcharだとどっちを使った方がいいとかありますか??? struct A{ char n : 1; char m : 7; }; struct A{ bool n : 1; bool m : 7; };
186 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:02:53 ] >>179 何をしたいのか分からんが、使える。
187 名前:185 [2007/05/15(火) 20:07:05 ] 自己解決しました 移植性を考慮して、unsigned char n : 1; にしておきますね
188 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:10:51 ] 移植性が欲しいならunsigned intにしておけ
189 名前:デフォルトの名無しさん [2007/05/15(火) 20:12:37 ] >>188 サイズは出来るだけ削りたいんです 上の例では32bit使っていますけど 8bit以内ならcharのほうが削れます
190 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:13:25 ] ビットフィールドに使えるのはsignedかunsignedのintだけ。
191 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:15:54 ] ビットフィールドの移植性って実のところどうなの? 一応、標準だよね?
192 名前:デフォルトの名無しさん [2007/05/15(火) 20:16:15 ] bcc(c++)だと使えますけど
193 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:21:35 ] >>192 処理系依存で他の型が使えても構わないことにはなっている。
194 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:22:42 ] C++ならほとんどの整数型が使えるだろ。
195 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:31:15 ] >>189 unsigned charがビットフィールドに使える処理系で、 同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで 違いが生じるなんて話聞いたことがない。
196 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:42:39 ] >>195 #include <iostream> template<typename T> struct S { T a: 1; T b: 7; }; int main() { std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl; std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl; } g++だと違う結果になったが。
197 名前:デフォルトの名無しさん [2007/05/15(火) 20:42:42 ] >>195 違いますけど・・・ #include <stdio.h> int main(void){ struct A{ unsigned int m : 1; unsigned int n : 7;}; struct B{ unsigned char m : 1; unsigned char n : 7;}; printf( "%u\n", sizeof(struct A) ); printf( "%u\n", sizeof(struct B) ); return 0;}
198 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:51:15 ] VC8で確認。こちらも違った。
199 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 21:54:53 ] VC7.1でも違った。
200 名前:デフォルトの名無しさん [2007/05/15(火) 21:58:58 ] ふつう違うよな int とchar 一バイトと四バイトだんもんな
201 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:01:29 ] その理屈はおかしい。
202 名前:デフォルトの名無しさん [2007/05/15(火) 22:29:47 ] BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、 私は何を誤っているのでしょうか? どう直せばよいか教えていただけないでしょうか。 ●ソース #include<iostream> class Singleton { public: static Singleton getInstance() { if(&singleton == '\0') { singleton = *(new Singleton()); std::cout << "Created!" << std::endl; } else { std::cout << "Not Created!" << std::endl; } return singleton; } ~Singleton() {} private: static Singleton singleton; Singleton() {} }; int main() { Singleton s1 = Singleton::getInstance(); Singleton s2 = Singleton::getInstance(); }
203 名前:202 [2007/05/15(火) 22:31:15 ] エラーの内容は次の通りです。 ●コマンドラインとエラー X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland X:\data\src\Singleton.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)
204 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:33:49 ] 一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ Singleton()::getInstance();
205 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:39:53 ] static変数の実体がないって怒ってるわけなんだが… そんなことよりも、何もかもが誤りだから ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。
206 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:41:02 ] >>202 クラスの静的メンバ変数は、外部で定義しなければならない。 Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。 それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。 class Singleton { public: static Singleton getInstance() { return singleton; } ~Singleton() {} private: static Singleton singleton; Singleton() {} }; static Singleton Singleton::singleton; マルチスレッドを考慮するなら、Singletonはポインタ、 当然std::auto_ptrやboost::scoped_ptrあたりにすべき。
207 名前:202 mailto:sage [2007/05/15(火) 23:07:21 ] >>204-206 有難うございます。 マルチスレッドやboostのライブラリは当分手を出しません。 コマンドラインアプリをある程度満足に作れるようになってから先に行きます。 まだポインタの使い方も習得できてないわけですし。 ずっとJavaをやってきたんですが、アレは全部参照扱いだから ポインタと実体を意識するシーンは限定されてたんですが、 C++はそうでないから難しいです。 C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。 仕事ではないので、手探りでなんとかやっていこうと思います。
208 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:12:41 ] Accelerated C++マジオヌヌメ
209 名前:206 mailto:sage [2007/05/16(水) 00:07:44 ] >>206 getInstanceがSingletonへの参照を返すようにするのを忘れていたorz 正しくはこう class Singleton { public: static Singleton& getInstance() { return singleton; } private: static Singleton singleton; Singleton() {} Singleton(const Singleton&); ~Singleton() {} Singleton& operator =(const Singleton&); };
210 名前:202 mailto:sage [2007/05/16(水) 01:31:34 ] >>208 Amazonのレビューによると、 既に他言語の知識がある人間にとって丁度良い本のようですね。 店頭で探してみます。 >>209 ありがとうございます。 operatorを使うんですね・・・。 まだ「パッと見」で、なぜこれがシングルトンを実現するのかが 分からないレベルなので、ソースを研究してみます。
211 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 01:44:03 ] Singleton(const Singleton&); Singleton& operator =(const Singleton&); はインスタンスのコピーを禁止するためのちょっとした工夫だよ。 privateにする&処理の内容を記述しないことで、 コピーしようとしたらコンパイルエラーになるようにしてる。 あと、コンストラクタをprivateにしてるのも、 getInstance()以外で勝手にインスタンスを作られないようにするため。
212 名前:202 mailto:sage [2007/05/16(水) 01:58:23 ] >>211 ありがとうございます。 なるほど、インスタンスのコピー禁止も意識しないといけないんですね。 privateなコンストラクタについては、Javaも同じ手法なのでわかりました。
213 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 06:57:01 ] C++で読むデザインパターン ttp://www.01-tec.com/document/cpp_design_pattern.html
214 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 09:59:08 ] XPです。 タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか? アイコンは32x32,256色と16x16,256色が入ってます。
215 名前:214 mailto:sage [2007/05/16(水) 10:36:34 ] ソース nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0); リソース IDI_ICON1 ICON "1.ico" こんな感じで読み込んでます。 それとあともう一つお願いします。 タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、 右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか? タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。 それぞれの位置の場合の処理を書く必要があるんでしょうか?
216 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:51:57 ] そのアイコンを試しにクライアントエリアに描いてみては 位置指定は、、、思ったとおりにやってみなよ