[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 08/27 18:32 / Filesize : 189 KB / Number-of Response : 742
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.37【環境依存OK】



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 ]
そのアイコンを試しにクライアントエリアに描いてみては
位置指定は、、、思ったとおりにやってみなよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<189KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef