1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
528 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:44 ] >>526 ソースとエラーメッセージうp 長いなら >>6 へ
529 名前:デフォルトの名無しさん [2010/03/05(金) 02:15:54 ] >>528 長いんで省略した形で記述します。 たとえば ================================== //○×.h class Cabc : public ** { 省略 public: //ここでグローバル変数を記述したい static CString str; //省略 } ///////////////////////////////////// ○X.cpp //省略 str = _T("a"); //省略 ///////////////////////////////////// このstrの値を他のクラスで使いたい場合 CString buf; buf = Cabc::str ; のようにしてもダメなんでしょうか? わかりにくくてごめんなさい なにぶん初心者ですのでよろしくおねがいします
530 名前:デフォルトの名無しさん [2010/03/05(金) 02:17:13 ] >>527 公式に「主従」なんかないだろう 俺は事の経緯から導かれる道義的な関係を指摘したまで
531 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:22:40 ] >>515 extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。 構文の解釈が変わるなどといったことは起こらない。 互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。
532 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:31:53 ] >>530 いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。 C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。
533 名前:デフォルトの名無しさん [2010/03/05(金) 02:36:39 ] >>532 C89 の目玉が C++ からの逆輸入という事実もあるわな 当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ どっちが合わせるべき立場にあったかは明確であろう
534 名前:デフォルトの名無しさん [2010/03/05(金) 02:37:24 ] 今日は寝落ち
535 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:45:27 ] >>533 合わせるべき立場とか、無いから。それ、妄想だから。 その調子で「C++0x は C# に合わせるべき立場にいる」とか 「C++0x は D に合わせるべき立場にいる」言い出すやつが いたとしたらどう思うよ? あんたが C++ 大好きなのはわかったが、これはさすがに 言いすぎだろ。
536 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:58:29 ] 先発のものが後発に合わせるわけにはいかないってだけのことだろ C#がC++0xに対して互換性が無いのと一緒
537 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:00:29 ] long longや可変個引数マクロ、数学関数などC99からC++0xへ持ち込まれるものだってある。 初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。 CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。
538 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:04:36 ] 内部クラスではtemplateが使えないのでしょうか? 以下のようなコードとコンパイルエラーが出ます。 gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) test0.cpp: In function ‘void func()’: test0.cpp:14: error: expected primary-expression before ‘template’ test0.cpp:14: error: expected ‘;’ before ‘template’ test0.cpp:30: error: expected ‘}’ at end of input 12: void func() 13: { 14: template<class T> 15: class Hoge{ 16: public: 17: static void foo( const T& val ){ 18: cout << val << endl; 19: } 20: }; 21: 22: Hoge::foo(); 23: }
539 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:24:35 ] 使えない。
540 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:03:48 ] >>529 > わかりにくくてごめんなさい わかりにくいのは、エラーが何なのかをキミが隠しているからだ。 人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて 送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。
541 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:57:39 ] >>529 .cppのstrって何者?
542 名前:デフォルトの名無しさん [2010/03/05(金) 07:37:28 ] >>540 えっと、、そこまで難しいことではないんです ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ でそういうのはどうするのか?という質問なんです。
543 名前:デフォルトの名無しさん [2010/03/05(金) 07:39:41 ] >>541 ヘッダで宣言したCStringのつもりです。 このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか? とても困っています よろしくお願いします
544 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:42:25 ] ここまで頑としてエラーを書かないのは何でだろうね。 クイズの出題者気取り?
545 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:44:23 ] 静的メンバ変数でググれ
546 名前:デフォルトの名無しさん [2010/03/05(金) 07:50:13 ] >>544 エラーは LicenselistViewerList.obj : error LNK2001: 外部シンボル ""public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CLicenselistViewerList::strrr" (?strrr@CLicenselistViewerList@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)" は未解決です。 です。 俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです 本当に困っています
547 名前:デフォルトの名無しさん [2010/03/05(金) 07:51:54 ] >>545 ググって解決できないから頼んでます。 静的メンバ変数だとこのやりかたで宣言したstrは Cabc::strで外の変数を使えるとあります。 使えません どうしてでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:03:30 ] 宣言はあってる 定義の仕方が悪い
549 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:08:19 ] >>546 エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ class名::str; を.cppの先頭付近にでも書いとけ
550 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:48:45 ] >>546 > strrr "r" 増えてね?
551 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:52:05 ] デュラララみたいな
552 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 13:23:56 ] >>546 static CString CLicenselistViewerList::strrrという静的メンバ変数の 実体の定義が見つからないのでリンクできないというエラー 静的メンバ変数はヘッダで宣言のみではダメで実体の定義 CString CLicenselistViewerList::strrr; を.cppファイルに記述する必要がある
553 名前:デフォルトの名無しさん [2010/03/05(金) 14:19:52 ] あのー *x1 += a; ってどういう演算するんですか?
554 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:21:33 ] >>553 x1 の指すオブジェクトに a を加えるっぽい。 これ以上は x1, a の型を明らかにしないとわからん。
555 名前:デフォルトの名無しさん [2010/03/05(金) 14:28:19 ] っへー!! てっきり、num1 = a + *x1; とかで何か用意しないとこのaと *x1の合計は作れないものだと思ってました! てことは -=で引き算出来るんですか? ホンマ助かりました。今ポインターの勉強してるんです。 ちなみに問題は最初に点数を指定させて、加算点を入力させるというものです。 やさしいc++第3版 著高橋 をやっていました。回答例に出てきていたので なんぞこれってかんじでした
556 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:30:03 ] 引き算できるよ。*=,/=もあるし&=,|=,>>=みたいなのもある
557 名前:デフォルトの名無しさん [2010/03/05(金) 14:31:29 ] 人の顔のAA二ミエマス。 ホントに貴方紳士ですね!また質問に着ます! 有り難うございました
558 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:41:48 ] >>557 名無しさんが一人だとでも思ってるのか?
559 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:29:43 ] 環境:WindowsXP、VS2008 Express Edition 知っている方がいましたら教えて下さい。 現在、GUIアプリの作成を行っているのですが、 (Windowsフォームアプリケーション開発) 一つ分からない事があります。 下のURLにあるようなTreeViewが欲しいのですが(ページの上の方にあるやつです)、 www.codeguru.com/cpp/controls/treeview/multiview/article.php/c3985 どうやって実現するのでしょうか? ツールボックスを見ても、TreeViewはあるのですが、 上記のようなTreeView+Columnというのがどこにあるのか分からなくて・・・。
560 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:48:23 ] こっちで訊くのがいいと思う pc12.2ch.net/test/read.cgi/tech/1259076828/
561 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:50:34 ] >>560 誘導サンクス。 >>569 は誘導先で聞いてみます。
562 名前:561 mailto:sage [2010/03/05(金) 15:51:16 ] ×>>569 ○>>559
563 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:51:18 ] struct a{ virtual ~a{} }; struct b : a{ int array[8] }; //... a *ptr = new b; //... delete ptr; //ptrはa*だけど実際に指しているのはヒープに配置されたbのインスタンス. sizeof(a) != sizeof(b)なのにこんな事してもいいの?
564 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:57:40 ] いいよ
565 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:58:11 ] 全て分かった上で、話題作りで書き込んでる様に見えるんだが そりゃ解体子が仮想だから
566 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:15:07 ] >>565 destructorがvirtualかどうかは関係ないでしょ? >>563 newしたときのサイズがどこかにしまってあるから。
567 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:22:33 ] >>566 すまんが釣りに見える
568 名前:563 mailto:sage [2010/03/05(金) 16:30:00 ] 解体子っていうのはクラス内部のリソースを開放したりするためのもので、 自身がヒープに配置されていたり、それのメモリ管理は関係ないような認識でした。 事実、インスタンスがスタックに配置されていてもデストラクタは走ります。 これは、インスタンスのメモリ管理はインスタンスを抱えているスコープが管理するべきだという事です。 曖昧な理解が解消して助かりました。ありがとうございます。
569 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:11:53 ] Java厨は勉強熱心だなぁ それにくらべてC++erは・・・
570 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:17:57 ] >>566 ちょっと焦ったわ なわけねえだろw
571 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:46:12 ] JavaとC++の両刀使いの人っている?
572 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:47:38 ] ASもJSもPerlもRubyもEsolangも普通にやるがね
573 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:54:59 ] 563は納得したのだろうか。 確保した領域の大きさについてだけ言えば566が正しいと思う。 確保した自由記憶領域の大きさはOS(システムコール)が記録している。 解放する時に大きさを知っている必要は無い。 p = malloc( N ) の後 free( p ) だけでいい(Nを指定する必要が無い) のと同じ。 そういう意味では565は見当外れ。 まぁC++スレだし、そういうことを訊きたい訳じゃないんだろうけど
574 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:58:27 ] ポインタを整数サイズで-1して整数表現で取り出したらサイズだったなんてことはよくある事
575 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:09:37 ] 上のシンプルな例ならともかく多重継承なら死にかねない
576 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:58:38 ] copy(vec.begin(),vec.end(),ostream_iterator<T>(cout,"#")); だと最後にもセパレータが入って 1#2#3# となってしまいますが、 1#2#3 がたいてい欲しいものだと思います。 whileの内で条件分岐させる以外にうまい方法知りませんか?
577 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:20:28 ] 最後の一つ前までやればいいだけにみえる
578 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:34:14 ] >>577 --vec.end() なんて怖すぎます! ・・・ブルブル。
579 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:18 ] ランダムアクセスイテレータならcontainer.end() - 1でいいだろ
580 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:49 ] 怖くねーよカス
581 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:42:41 ] あれ、空のときに困ると思ったんだけど、 やってみたら大丈夫だった・・・?!
582 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:44:05 ] あ、わかった。 要素が一個だけのとき、何も出力されなくなる。
583 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:46:19 ] >たいてい欲しいものだと思います いや別に。 上手いやり方か知らんが、自分で適当に ↓みたいな反復子を作るのは駄目なのか? codepad.org/o3QbtQyC
584 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:47:03 ] いや、そもそもぜんぜんダメだ。 v=[3,4] のとき、出力が 3# ですよ。。。
585 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:51:56 ] >>583 やっぱそっちですか。 イテレータとかすぐに書けないけど・・・。 ありがとうございます。
586 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:46:35 ] >>585 楽してイテレーター書くならこんなのどうかな。 www.kmonos.net/alang/boost/classes/iterators.html
587 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:59:38 ] boostはホント何でもありますね・・・。 なるべく依存したくないけど。 >>583 理解できたので、ほとんどそのまま使いまわせそうです。 たいへん助かりました。
588 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 22:04:19 ] >>587 boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。
589 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:54:10 ] >>575 何のこと?
590 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:16:34 ] Hoge Hoge::getObj( ){ return *this; } Hoge& Hoge::getObj( ){ return *this; } return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で 参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。 上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが どうですか? (どうですか?、って言っても仕様だからどうかなる話ではないのですが)
591 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:42:38 ] それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。 int func1(const Hoge& h); int func2(Hoge h); Hoge hoge; func1(hoge); func2(hoge); // 同じ書き方 関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、 関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。 エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。
592 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 08:48:31 ] constなら区別して呼び出せるけどね void foo(int& a); void foo(const int& a); int a; //constではない foo(const_cast<const int&>(a)); //ここはconst版を呼びたい
593 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 10:22:01 ] 関数宣言見ただけじゃ参照かどうかわからなくて困るだろ と思ったけど int &a = @b; みたいにしてほしいってことなのかな
594 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:19:24 ] constにするときはstatic_castでいいんじゃないか
595 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:30:14 ] そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ
596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ] シンタックスシュガーは もっと多くてもいい
597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ] オレサマプリプロセッサ作って好きに構文創作しれ
598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ] >>597 #define amigo friend; 愛用してます
599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ] フレンド程度に内面を洗いざらいさらしていいのか?
600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ] >>597 #define foreach BOOST_FOREACH
601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ] >>599 friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。
602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ] #define buddy friend; じゃないの?
603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ] friendはクラステンプレート中にテンプレート関数を定義したい 時に、暗黙の型変換ができるように使っている。 Effective C++で紹介されていた内容。
604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ] >>598 ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか
605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ] そこは指摘せずにそっとしておく所だろ
606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ] abort() if (!p); みたいに書けるようにはならんのか。
607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ] if (!p) abort() ;
608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ] >>606 C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。
609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ] perlではif文を後に書くのか?
610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ] >>596 言語の文法は最小限でライブラリで拡張できるほうがいい。
611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ] すいません嘘です
612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ] abort() if(!p) else exit(); とか普通に書きたいんじゃないの?
613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ] >609 文修飾子という扱いで後ろにも置ける。 if(e) { func(); } func() if e; は OK だけど、 if(e) func(); { func() } if e; はできない。
614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ] >>613 2種類の書き方があるっていうか、そういうのって分りにくくないのかな? 後に書くということは func(すっげー長い式なんたらかんたらどうのこうの) if e; だと読むときifを読み落としそうだなあ。
615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ] ワケ分からんw C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。 { func() ; } if e ; ができないというのは、ものすごく違和感があるな。
616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ] struct A; struct B{ B( A& ); } A a(); // これとか B b( A() ); //これが 関数宣言にみなされない書き方ないの? A a; B b( a ); とかじゃない方法で。
617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ] >>615 思うに。 { すげーー長い文 なんたらかんたら だらだらだらだら } if e; って読むのに困るよね。 do{}while()でも読みにくいのね。
618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ] do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、 それほど読みにくいってほどでもないんじゃないかな。
619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ] >>616 ないよ。
620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ] func() if e; はシンタックスシュガーの一例か? 混乱の割にメリットは感じられない。
621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ] ループの先頭などで、 break if foo continue if bar とかするのは気持ちいい。
622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ] だから、perl以外の言語は触らずに perlだけ使ってなよ。
623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ] ハ,,ハ (*゚ω゚ ) >>622 お断りします。Rubyも使います。 . (=====) _(_⌒) ) /\ `J  ̄ ̄\  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ | / \  ̄ ̄
624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ] perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?
625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ] foreach(int x, std::make_pair(v.begin(), it)) みたいにカンマが含まれても大丈夫なマクロが欲しいです
626 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:30 ] >614 Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という スローガンがあってな。 >615 Perl では { } は block であって文じゃないんだ。 >620 if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。
627 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ] >616 ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ] あの、ひとついいですか? 僕は現在高校2年生です。そんなぼくにもC++はマスター できます?