- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
- 231 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:01:14 ]
- 反復処理とか繰り返し処理とか
- 232 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:38:29 ]
- >>210
メモリのサイズを入れる型ってsize_t以外になんかなかった?
- 233 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:50:58 ]
- 繰り返し処理のことを何ていいますか?
専門的にお願いします。
- 234 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:55:57 ]
- ループ処理じゃね?w
反復も繰り返しだろうけど、お前は違い分からないだろう
- 235 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:26:00 ]
- ぶっちゃけC/C++の話じゃないからスレ違い
- 236 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:29:11 ]
- >>234>>231>>229
もうちょっとかっこいい言い方あるだろ それを教えろ
- 237 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:09 ]
- >>236
死ねハゲ
- 238 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:47 ]
- 反復処理とか繰り返し処理とか
- 239 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:47:20 ]
- リピート
- 240 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:14:30 ]
- >>228-231
見事な繰り返し処理 >>232は空気嫁
- 241 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:19:39 ]
- >>232
ssize_tとか、でもCでもC++でも標準ではないけど。
- 242 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:24:27 ]
- >>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
- 243 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:34:14 ]
- >>241 >>242
そうだな。size_tでよかった。
- 244 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 05:50:11 ]
- まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW); と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
- 245 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:13:52 ]
- >>244
何故、どう巧くいかないのか書かないのですか?
- 246 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:28:56 ]
- 実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;
- 247 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:39:59 ]
- batの最後に
pause 入れとけ
- 248 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:00:46 ]
- >>247
ありがとうございます。 やってみたところ指定されたパスがありませんとのことでした。 普通にbatファイルを起動すると何も問題がないのですが・・・ 原因などわからないでしょうか?
- 249 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:08:14 ]
- ファイルパスをちゃんと指定すればいいじゃん・・・
- 250 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:12:19 ]
- できました!
こんな時間に、質問に答えてくださりありがとうございました 大変助かりました。
- 251 名前:デフォルトの名無しさん [2009/03/03(火) 18:34:32 ]
- 以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか? static unsigned int * ADDR; スペースが、後だけのもは参考書にも紹介されていますが 前後両方ともスペースのものは見つかりませんでした。 よろしくお願いいたします。
- 252 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:01:49 ]
- vector<string> * const (&u)[buf]; // こんな感じですか?
- 253 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:06:04 ]
- >>251
おんなじ。空白類がいくらあろうと関係ない。
- 254 名前:デフォルトの名無しさん [2009/03/03(火) 19:47:28 ]
- >>252
static unsigned int * ADDR; 全くこのままのコードです。 >>253 ご回答有難う御座いました。 もやもやしていましたが、これですっきりしました。
- 255 名前:デフォルトの名無しさん [2009/03/04(水) 03:11:45 ]
- VC++9の質問です。Unicode環境で
Void Func(LPCSTR pMsg); みたいな関数があって、ここに文字列を渡すのですが、 Func("xxx"); というように普通に書くと問題ないのですが、 Func(_T("xxx")); とやると、 const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。 全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
- 256 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 03:14:42 ]
- >>255
_Tで括るのはLPC"T"STRのとき。 LPCSTRはconst char*のtypedefだから_Tは要らない。
- 257 名前:デフォルトの名無しさん [2009/03/04(水) 03:25:58 ]
- >>256
なるほど、ありがとうございました。
- 258 名前:デフォルトの名無しさん [2009/03/04(水) 13:36:24 ]
- 初歩的過ぎてすいませんが...
すでに宣言してある配列の配列数を求めて それと同じ配列数の配列を宣言するには どうすればいいですか? よろしくお願いします。
- 259 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:39:38 ]
- >>258
配列数はプログラム書いた人しか知らないから無理 それができたら配列のオーバーフロー管理も楽なんだけど
- 260 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:40 ]
- >>258
状況がよくわからん
- 261 名前:259 mailto:sage [2009/03/04(水) 13:44:42 ]
- sizeof(配列) / sizeof(型)
でいいか マクロで定義して同じマクロ使うとか
- 262 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:49:06 ]
- char a[]={10, 10, 10};
char b[sizeof(a)]; int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
- 263 名前:258 mailto:sage [2009/03/04(水) 13:53:28 ]
- すいません言葉が足りなすぎました。。
int a[]= {1,2,...}; size=sizeof(a)/sizeof(a[0]); int b[size]; として同じ配列数の新しい配列を宣言しようとしてもできません。
- 264 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:56:39 ]
- C++ なら const int size
Cなら int b[sizeof(a)]
- 265 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:14 ]
- >>263
size の型は何か 言語をいえ言語を C か C++どっちだ あとCならC89かC99なのか
- 266 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:33 ]
- >>263
コンパイラも
- 267 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 14:03:12 ]
- >>265
C++です。 size の型はintです >>266 gccです。
- 268 名前:258 mailto:sage [2009/03/04(水) 14:08:43 ]
- const int size = sizeof(a)/sizeof(a[0]);
int b[size]; として宣言できました。 ありがとうございました。
- 269 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:03:27 ]
- 配列の要素に変数が使える規格って無かったっけ
- 270 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:30:51 ]
- >>269
C99だろ
- 271 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:19:24 ]
- 連立方程式のを渡したら戻ってくる関数ってありますか?
- 272 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:20:51 ]
- >>271
標準にはない 標準じゃなくていいならある
- 273 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:53:35 ]
- assert()と_ASSERT()ってなにか違いがあるのでしょうか?
- 274 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:11:11 ]
- assertはC/C++標準
結果としてabort() _ASSERTはVC++独自 _CrtSetReportMode等で動作の調整が可能
- 275 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:14:15 ]
- メンバ関数のポインタの宣言はCxxx::*funcなのに
取得はCxxx::&funcでなく&Cxxx::funcなの? &がなんで宣言の時の*の位置より移動するの?
- 276 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:40:47 ]
- >>275
発想としては、Cxxx::という修飾が メンバへのポインタ型では*にかかっていて、 メンバへのポインタを得るときには、メンバ名funcにかかっている ということのようだ。
- 277 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:51:32 ]
- 俺としては逆なんだが
なんでCxxx::&funcなの? どこのクラスのメンバ関数のアドレスか分からんが
- 278 名前:デフォルトの名無しさん [2009/03/05(木) 20:41:28 ]
- 大変だー
さっぱりわからん
- 279 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:43:44 ]
- >>278
何が分からないんだかさっぱり分からないぞ
- 280 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:44:43 ]
- >>275
単に文法的な曖昧さを除いた結果そうなっただけ。 class A { public: static void (*A::func)(); }; としてしまうと、static メンバ変数の実体定義がこうなってしまう。 void (*A::A::func)(); どっちがどっちの A:: やら分からん。
- 281 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 21:16:46 ]
- もうクラスのメンバ関数のポインタは無しで
- 282 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:09:09 ]
- 9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。
- 283 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:41:19 ]
- delegate パターンで使うね
- 284 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:31:13 ]
- じゃあdeleteパターンで
- 285 名前:276 mailto:sage [2009/03/06(金) 19:49:52 ]
- >>276, >>280
すみません、レス読んでも、それが 取得はCxxx::&funcでなく&Cxxx::funcなの? の回答になるのか、さっぱり理解できないですが>< あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが なんで良くないんですか?
- 286 名前:デフォルトの名無しさん [2009/03/06(金) 20:12:15 ]
- なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
- 287 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:16:31 ]
- >>286
まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
- 288 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:24:22 ]
- >>287
ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
- 289 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:27:48 ]
- >>286
派生クラスがない、ではなく、派生クラスは自分で作れということでは?
- 290 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:29:59 ]
- ああ、そうかもしれない
- 291 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:43:25 ]
- "派生クラスの無い抽象クラスが型な引数をとる関数"
これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
- 292 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:56:18 ]
- 覚えておきます、ありがとうございました
- 293 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:13:20 ]
- >>285
普通の関数でも&(func)はよくないだろ? そういうこと
- 294 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:51:58 ]
- >>293
普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか? >>280 のvoid (*A::func)(); は何を宣言しているんだ? 本人はメンバー関数へのポインタ宣言のつもりなのかな これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ 俺俺解釈間違ってる?
- 295 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 23:05:45 ]
- >>294
関数は式中に現れると関数ポインタに暗黙変換される だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる つまり関数ポインタへのポインタになる そして(func)は右辺値だから、そんなものを使うとろくなことにならない 一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから 無事にfuncへのポインタが取れる と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい だから&funcも&(func)も全く一緒だ すまん
- 296 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:59:08 ]
- グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」 と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、 プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので //EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。 memset(EDIT_DATA, 0, sizeof(EDIT_DATA)); という処理を加えたところ途端にメモリの使用量が跳ね上がりました。 最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので いったい初期化処理を行っていない宣言した直後のグローバル変数と memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
- 297 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 00:16:13 ]
- おまいの使ってるOSが
書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
- 298 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:38:45 ]
- >>297
私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが 以下のような考えでよいのでしょうか? 私の使っているOS(WinsowsXP)の場合 ・関数内で宣言するローカル変数の場合 void main(){ int a; //この時点で非初期化データ領域に変数aの存在が知らされる。 printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない) a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", a); //0が表示される(物理メモリにはaが存在する) } ・関数外で宣言するグローバル変数の場合 int b; //この時点で非初期化データ領域に変数bの存在が知らされる。 void main(){ printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える) b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", b); //0が表示される(物理メモリにはbが存在する) }
- 299 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 06:38:13 ]
- >298
とりあえず環境依存の話だというのは認識しておいてくれ。 まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。 ローカル変数は BSS には確保されない(スタックに確保される)。 非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に 「知らされる」という表現はおかしい。 物理メモリの割り当ては OS、ローダが行う。 恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。 なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか? 「仮想記憶」でぐぐるといいと思う。
- 300 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:00:03 ]
- void fn(int x){〜;};
void fn_nul(int){}; if(a){ fn(a);} と static void (*const_f[2])(int) = {fn, fn_nul}; f[(a>>3)&0x1](a); どっちが効率いいかな?
- 301 名前:300 訂正 mailto:sage [2009/03/08(日) 08:01:30 ]
- static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a>>3)&0x1](a);
- 302 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:08:17 ]
- >>299
やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。 仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。 もう少し時間をかけてじっくりと理解を深めていこうかと思います。 ありがとうございました。
- 303 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:23:48 ]
- CPUアーキテクチャ側から勉強するといいかもね。
俺は「はじめて読む486」という本が参考になった。
- 304 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:46:03 ]
- >>301
下の方が効率いい。 ただし、何かコメントしておかないと 可読性が低い。
- 305 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:01:16 ]
- >>303
CPUじゃなくOS
- 306 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:10:52 ]
- 困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、 もう一つはMAINスレッドにあるリードルーチン。 MAINスレッドにあるリードルーチンをある条件時に寝かせ、 CALLBACK関数側から寝てる状態を起こしたい処理なのですが、 何か良い方法ありますでしょうか? sigwait()を使ってできそうなんだが、通常処理なので signalは使いたくないのです。よろしくお願いします。
- 307 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:12:40 ]
- >>306
環境依存なので利用環境を書いてね
- 308 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:31:42 ]
- 306です。
環境:linux. gcc version 4.3.2 ,SDL(Callback) マルチスレッドではないのですが、CallBack関数側から、 MAINスレッドの寝ている状態を起こせないものかと、、、 MAINスレッドでやっている処理は、標準入力から データ読み込み、固定領域にバッファリングしています。 バッファが一杯だったら、標準入力からの読み込みは しないで寝かせたいのです。(BusyWaitやポーリングはNG) gdk_input_addとgtk_mainの組み合わせで とりあえずできたのですが、gtkを使うのは目的外かと、 よろしくお願いします。
- 309 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 20:08:54 ]
- >>308
pthread.h を覗いてみては? pthread_cond_??? あたりでいけそう
- 310 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:11:29 ]
- >>309
サンクスです。チューw pthread_cond_wait(&cond,&mutex); pthread_cond_signal(&cond); 上記で実装しました。動作OKでした。 mutexの使い方は良く判りませんがこれから理解しておきます。 CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。 (DIONは書き込み規制はいってるの?)
- 311 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 03:45:12 ]
- ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが
(ただのパクリですが・・・もちろん勉強のためです) CStatic : public CWindow { public: CStatic(HWND hWnd) : CWindow(hWnd) {} CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; } ... }; CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す などのCStaticコンストラクタの初期化がコンパイル通りません。 >error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません) 考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが ATL/WTLではこれが上手くいっているのは何故なんでしょうか? ATL/WTL見たことある方で分かられる方があればご教示ください。
- 312 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:09:36 ]
- CStatic& operator=(HWND hWnd)
それ以前にこれ間違ってね?
- 313 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:16:54 ]
- >>312
レスありがとうございます。 WTLのをそのまま流用したつもりでしたが; どこが間違ってるのでしょうか?戻り値の参照ですか?
- 314 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:27:45 ]
- いや、それだけしかないなら
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す これに当てはまるoperator=が無いじゃん
- 315 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:47:48 ]
- >>314
すみません、そもそもoperator=は今回関係ないみたいです。 コンストラクタの初期化で CStatic text(GetDlgItem(IDC_STATIC)); CStatic text = GetDlgItem(IDC_STATIC); 上の2つは同じという認識だったのですが上だけコンパイル通ります; CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
- 316 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 10:11:14 ]
- IDC_STATICは実際にこう書いてるの?
IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
- 317 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:02:57 ]
- >>316
遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。 例えばATL/WTL解説で有名な↓ここ home.att.ne.jp/banana/akatsuki/doc/atlwtl2/stdctrl05/index.html では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。
- 318 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:03:55 ]
- >>315
コンストラクタにexplicit付いてんじゃねぇの
- 319 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:49:52 ]
- >>318
explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか; 試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか? class A { // 基底クラス public: DWORD_PTR a; // データメンバ operator DWORD_PTR() { return a; } A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ A getData() { return A(a); } // 自クラスでキャスト }; class B : public A { // 派生クラス public: B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ B& operator=(DWORD_PTR x) { a = x; return *this; } }; A aaa; B bbb = aaa.getData(); // NG bbb = aaa.getData(); // OK それともこの再現自体が間違ってるのでしょうか・・・?
- 320 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:53:33 ]
- >>319
class A に A(a)のコンストラクタは付けないの?
- 321 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:06:28 ]
- >>319
VC2008EEで通ったけど
- 322 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:42:54 ]
- class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?
- 323 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:59:40 ]
- [質問内容]
C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、 メンバ配列についてお行儀のよい書き方を教えてください。 メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、 文字列や値は同様にメンバ変数として持つのか? それとも、 cppの上の方に無名空間で切った変数を新たに宣言するのか? そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか? ちょっと、わからないので教えてください。
- 324 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:34:42 ]
- static constならクラス内で初期化しない?
- 325 名前:323 mailto:sage [2009/03/09(月) 22:42:56 ]
- 簡単に言うと、以下のようなクラスを考えてください。
<hoge.h> class CHoge { public: CHoge(){} ~CHoge(){} private: enum { END = 10 }; static const int Array[END]; }; <hoge.cpp> const int CHoge::Array[END] = { 0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか? }; >>324 レスありがとうございます。 その場合、マジックナンバなどはどこに宣言してありますか?
- 326 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:52:04 ]
- >>325
そのまま数値書いてコメント付けとけばいいんじゃねぇの。 その値をどういう意味があって、どう使うかわからんから ケースバイケースとしか言いようが無いと思うけど。
- 327 名前:323 mailto:sage [2009/03/09(月) 23:05:52 ]
- >>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。 ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると その構造体配列自体で、共通する値が出てきます。 <hoge.h> class CHoge { public: CHoge(){} ~CHoge(){} private: enum { END = 3 }; struct BTN_TAG { int X; int Y; int W; int H; char *Str; }; static const BTN_TAG m_BTN[END]; }; <hoge.cpp> const CHoge::BTN_TAG CHoge::m_BTN[END] = { { 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値 { 100, 300, 200, 50, "ボタン2" }, { 100, 400, 200, 50, "ボタン3" }, }; こういう場合は、どのようにするのがお行儀がいいでしょうか?
- 328 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:14:02 ]
- 文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?
- 329 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:26:46 ]
- >>327
そのまま100でいいんじゃないかなぁ。 200と50がデフォルトのボタン幅・高さとかだったり 頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。 でもまぁ俺だったら、UIの情報はプログラム中に書かず リソースや外部ファイルに書いて実行時に読み込むけど。
- 330 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:27:48 ]
- >>328
返信ありがとうございます。 リージョン固定というのを不勉強で知らないのですが、 CHogeからのみ参照できる、statc constだらけのクラスと考えれば いいでしょうか?
- 331 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:35:33 ]
- template<TwidthX, TwidthY>class Btn{
static struct{int x, y; char *c;}m_BTN[3]; } 追い出すメリットが勝つるメンバは追い出す。
|

|