1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1500329247/
582 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 17:00:09.46 ID:6q9VmxFv.net] a=1に対して、 cout << a << a++なら21 cout << a++ << aなら12 cout << a++ << a++なら21 と表示されました。 coutはどんな順番で評価されているのでしょうか?
583 名前:デフォルトの名無しさん [2018/04/14(土) 18:21:04.74 .net] >>571 確かに以下は https://ideone.com/sBACG3 21 12 21 と表示される でも、手元のVC 2017 / Windows 10 では 11 12 11 と表示された g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では 11 12 12 と表示された
584 名前:デフォルトの名無しさん [2018/04/14(土) 18:31:12.32 .net] >>572 codepad.org/KVv4KD8O ではコンパイルエラーになった。 cc1plus: warnings being treated as errors In function 'void test1()': Line 6: warning: operation on 'a' may be undefined In function 'void test2()': Line 12: warning: operation on 'a' may be undefined In function 'void test3()': Line 18: warning: operation on 'a' may be undefined techtipshoge.blogspot.jp/2012/01/c.html www.kouno.jp/home/c_faq/c3.html www.st.rim.or.jp/~phinloda/cqa/cqa7.html こんな書き方をするなってことだね
585 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 00:38:00.30 ID:/OvgYAab.net] >>571 いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、 評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。
586 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 08:36:03.86 ID:IUBKEb9a.net] 未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで 同じ順序で評価されない可能性もある、じゃないかな。 実際のところ、コンパイルごとに評価順が変化するとも思えないけど。 いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。
587 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 09:17:15.75 ID:CIuag2/D.net] >>573 おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな
588 名前:デフォルトの名無しさん [2018/04/15(日) 10:08:58.88 ID:c4dXLki+.net] class Base { public: void A(); protected virtual void B(); } void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } class Derived : public Base { protected virtual void B(); } void Derived::B() { cout << "Derived" << endl; } Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Derived」が表示される。 b = d; b.A() ⇒ 「Base」が表示される。
589 名前:デフォルトの名無しさん [2018/04/15(日) 10:11:08.98 ID:c4dXLki+.net] b = d; b.A() ⇒ 「Base」が表示される。 ↑で、なぜ、「Derived」が表示されないのでしょうか? ロベールの本に、 「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」 と書いてあります。
590 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:29:12.58 ID:VXOW+WoG.net] void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } A() の中で、B() を呼んでいるから A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。 こんなコーディングはしない
591 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:37:36.78 ID:sXJBpbWg.net] バカを装った荒らしか本当のバカか
592 名前:デフォルトの名無しさん [2018/04/15(日) 10:41:29.91 ID:c4dXLki+.net] >>578-579 よく分かりません。 ポリモーフィズムというのがありますが、その考え方だと b = d; b.A() ⇒ 「Derived」が表示される。 のではないかと思ってしまいます。
593 名前:デフォルトの名無しさん [2018/04/15(日) 10:59:34.87 ID:c4dXLki+.net] Base::B() の virtual を削除する: class Base { public: void A(); protected void B(); }; すると、 Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Base」が表示される。
594 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:27:00.75 ID:ZEcSoj1Y.net] ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。
595 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:33:52.43 ID:q/GS/gh9.net] スライシングとも別の問題のような
596 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:52:13.52 ID:igXjAIRS.net] bの型がBaseだからだろ?
597 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 12:16:46.54 ID:VXOW+WoG.net] まずこの本で、オブジェクト指向を学ぶ。 スッキリわかる Java入門 第2版、2014 最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w 軽く、数年を無駄にするだけ C++ なんて、偏差値70以上しか無理やのに
598 名前:デフォルトの名無しさん [2018/04/15(日) 12:34:26.84 .net] >>577 > b = d; > b.A() ⇒ 「Base」が表示される。 Base bp; bp = &d; b->A(); こうやね
599 名前:デフォルトの名無しさん [2018/04/15(日) 12:35:11.72 .net] >>582 間違えた Base *bp; bp = &d; b->A();
600 名前:デフォルトの名無しさん [2018/04/15(日) 12:36:47.16 ID:c4dXLki+.net] >>583-585 ありがとうございました。 C++が難しいというのは、設計が悪いからですか? C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに 設計することは無理ですか?
601 名前:デフォルトの名無しさん [2018/04/15(日) 12:37:23.54 ID:c4dXLki+.net] >>587-588 ありがとうございました。 試してみようと思います。
602 名前:デフォルトの名無しさん [2018/04/15(日) 12:43:40.81 ID:c4dXLki+.net] 理由があってC++を習得するのが難しいのならOKですが、設計が悪いから 難しいということになると、利用者にとっては迷惑な話ですね。
603 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:30:31.42 ID:VXOW+WoG.net] C++ は、何でも出来るようにしているから、ルール数が100以上ある さらに、ルールAでは、B, C は除くとか、 1つのルールが、他のルールとからむから、 非常に難しいし、組み合わせ爆発が起こる 膨大な時間を無駄にしても、さほど理解できず、身につかない。 組み込み機器も想定しているから、 どうしてこういうルールが必要なのか、初心者には理解できない。 Rust ですら、初心者には無理だろ だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。 ルールの多さで、廃人になってしまう 初心者には、絶対に無理。 最初から、エベレストを登るようなもの。 まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし このレベルでは言語どうこうじゃない。 小中高大学まで行くような、研修制度・道筋が大事。 徐々に基礎体力を付けていかないと、何もできない
604 名前:592 mailto:sage [2018/04/15(日) 13:45:38.29 ID:VXOW+WoG.net] ロベールでC++ を勉強するのも良いけど、 あくまで、C++ の初心者というだけで、 C++ をやるには、最低でも数言語は知っている必要がある 特に、Java, C, Rust は、絶対に知っていないといけない。 組み込みの知識も必要 C++ の初心者だけど、他の言語はプロ級で、 PC・組み込み・Linux コマンドも知っていて、C++ を始められる それでも、ほとんどのC プログラマーは、C++ へ進めない
605 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:49:36.88 ID:ldkcKhuZ.net] スッキリ厨はちゃんとコテ付けてくれ
606 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:24:18.71 ID:qZPDSYA2.net] 某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。 第3版が難読版というのは判る
607 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:55:19.09 ID:/OvgYAab.net] = が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、 という理解が必要なんだろうけれどこれ難しいだろうか? cから来た人なら struct base b; b = ...; で b の型が変わるなんて考えもしないだろうけど 最近の人は c やらないのかな
608 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 16:39:48.86 ID:VXOW+WoG.net] ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単
609 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 17:20:50.44 ID:s7NpyR5v.net] 原典も読まずに能書き垂れる奴っているんだなぁ
610 名前:デフォルトの名無しさん [2018/04/15(日) 18:07:17.49 ID:c4dXLki+.net] >>588 試してみました。 確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。 これはなぜでしょうか? #include "Derived.h" int main() { Base b; Base& br = b; br.A(); Derived d; br = d; br.A(); Base *bp; bp = &b; bp->A(); bp = &d; bp->A(); } 実行結果は以下です。 Base Base Base Derived
611 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:44:29.81 ID:ZEcSoj1Y.net] 参照は書き換えられないからな。 >br = d; 参照先のbに代入してるのと同じこと。
612 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:50:44.48 ID:CIuag2/D.net] >>599 当たり前 br は b の別名なだけだから b = d; ってやってるのと同じ b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし
613 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 00:20:31.20 ID:TXxoP4/a.net] 参照のポインタっぽい振る舞いを確認したいならこう Derived d; Base & b1(d); b1.A();
614 名前:デフォルトの名無しさん [2018/04/16(月) 07:57:32.89 ID:PsSdBUuj.net] >>602 ありがとうございました。 下の結果は、 Base Derived Derived になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が 解消することになると思うので、理解したいです。 #include "Derived.h" int main() { Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2(d); br2.A(); Base *bp; bp = &d; bp->A(); }
615 名前:デフォルトの名無しさん [2018/04/16(月) 08:01:12.80 ID:PsSdBUuj.net] Base Derived Derived となりました。 2番目と3番目は同じことの別表現のようですね。 見た感じ、1番目と2番目に違いがあるようには思えません。 Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2 = d; br2.A(); Base& br3(d); br3.A();
616 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:14:10.02 ID:TXxoP4/a.net] >>604 参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。 初期化と代入を区別すること。 Base& br1 = b; // 初期化 br1 は b の参照 br1 = d; // 代入 b = d と同じ動作 Base& br2 = d; // 初期化 br2 は d の参照
617 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:32:20.53 ID:PsSdBUuj.net] >>605 ありがとうございました。 >Base& br1 = b; // 初期化 br1 は b の参照 >br1 = d; // 代入 b = d と同じ動作 br1 = d としても参照先は変わらないんですね。 ありがとうございました。
618 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:10:28.34 ID:rDfY3L1y.net] Java,C#などのプログラマです。 C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、 https://ideone.com/k7g2nn ITestAとITestBはインターフェース的なものです。 で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを 作ったのですが、 CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは 抽象クラスになってて実体化できません。 ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? というかこういう場合C++ではどうすればいいのでしょうか?
619 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:43:19.10 ID:qlfABgAK.net] Base Pointer : 100〜119 Derived Pointer : 120〜139 こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。 100〜119 内で、Base クラスの変数・メソッドのアドレスを探す Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。 120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す
620 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 13:08:20.92 ID:5MYyAHFg.net] >>607 単なる文法エラーだからエラーメッセージみてコードを直してください
621 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:01:04.61 ID:rDfY3L1y.net] >>609 文法エラー?? https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。 あくまでイメージ目的でそこらへん適当にやりました。 すみません。 https://ideone.com/QxErKY こっちですね。
622 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:08:31.72 ID:rDfY3L1y.net] ちなみに、C#だとこんな感じです。 https://ideone.com/8SZhJ7
623 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:29:48.23 ID:7XdbFr6Z.net] CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな? ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる これならok https://ideone.com/FGHyda
624 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:32:34.81 ID:rDfY3L1y.net] もちろん、エラーなくしてコンパイルを通す方法は >>607 の >ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? で書いた
625 名前:ようにすればとりあえず、コンパイルは通ります。 聞きたいのは、 C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、 C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか?? それともC++では他の方法があるのでしょうか? [] [ここ壊れてます]
626 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:34:54.92 ID:rDfY3L1y.net] >>612 あ、すみません。ちょっと被ってしましましたね。>>613 は忘れて下さい。 >>612 のコードを見てみます。
627 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:08:36.13 ID:rDfY3L1y.net] >>612 そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。 まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。 ありがとうございます。
628 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:30:44.68 ID:7XdbFr6Z.net] >>615 インターフェース側をいじるのは仕方ない どっちかになる https://ideone.com/qrd4fN https://ideone.com/kVZzRi
629 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 16:21:16.33 ID:Gm7LZDiq.net] 実装とインタフェースの両方を継承するならこういう書き方もある ATL なんかがこれ式かな https://ideone.com/B7JWER
630 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 17:30:50.30 ID:rDfY3L1y.net] >>616 >>617 色々ありがとうございます。>>617 がよさそうなのでこれで行こうかなと思います。
631 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:08:59.76 ID:SGgdop5e.net] 巨大なファァイルの読み込みに関してです。 たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に 代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか? 現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?
632 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:20:32.18 ID:/qMRupTB.net] 行という概念が 先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない? ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど
633 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:29:32.71 ID:KTfx2aCu.net] >>619 テキストのフォーマットによっては高速化は可能 例えば1行が固定サイズとか行番号が書いてあるとか 全く自由なフォーマットだと頭から解析するしかない 読み込みスレッドと解析スレッドを分けると速くなることもあるかも 同じファイルが複数回指定されることが多ければ ファイル名と更新日時と1000行目の位置 のデータベースを持つとか
634 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:30:11.39 ID:cVYjBdTw.net] >>619 「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。 1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる) 1000番目のバイト位置を計算してそこから読むことができます。 FILE * を用いてシーケンシャルにたくさん読む場合は setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう いろんな行に何度もアクセスするなら、 全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。
635 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:36:06.95 ID:p5xwhAV/.net] 末尾にseekして、適当に戻って読んでみて、 改行がなければまた戻って、を繰り返すのが現実的。
636 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:40:13.25 ID:/qMRupTB.net] 巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?
637 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:50:32.61 ID:yyY2OAEq.net] 対象のテキストファイルとは独立に、 「そのテキストファイルの各行がファイルの何バイト目から始まるか」 という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。 >>622 の後半部分だな。
638 名前:619 mailto:sage [2018/04/17(火) 18:03:45.64 ID:SGgdop5e.net] 皆様いろいろご指導ありがとうございました。 私の能力では難しそうですが、いろいろ高速化を試してみます。
639 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:46:11.69 ID:NCQX7EWc.net] 末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して) \n が現れるまで1文字ずつ戻りながらキューに積んで 最後にキューの中身を逆順にする
640 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:55:56.84 ID:gaNnpc4H.net] 配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?
641 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 19:35:04.61 ID:wvS91pUR.net] >>628 scanf("%d",&n); int array[n]; //読み込んだ値を要素数にするってこういう事?
642 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:21:29.36 ID:AHw7lgSX.net] 基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。 auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、 newした場合はどうすればいいのでしょうか? autov = new vector<int>(); for (auto &i : v)だと begin関数が見つかりませんといってコンパイルできません。 どうすればいいでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:24:11.47 ID:AHw7lgSX.net] すみませんでした。普通に逆参照すればいいのか。 auto v = new vector<int>(); for (auto &i : *v)
644 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:46:42.62 ID:hZ2W0cz8.net] >>629 ありがとうございました
645 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 11:35:26.22 ID:uQo81sbZ.net] MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、 CやC++の仕組みのことなので、こちらで質問させていただきます。 複数のスレッドから呼ばれる関数の内部は、 CCriticalSectionを使って排他制御しています。 void Test() { static CCriticalSection cs; cs.Lock(); : cs.Unlock(); } 関数内のstatic変数は、その関数が初めて呼ばれたときに 実体が作成されると理解しているのですが、 1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に 他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、 正しく排他制御されるのでしょうか? コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか? それとも、CCriticalSectionの変数は、 関数の外に置かなくてはいけないものでしょうか? MFCの内部でも、AFXPlaySystemSound()などで 同じようなことをやっているようなのですが。
646 名前:片山博文MZ mailto:sage [2018/04/18(水) 11:57:34.76 ID:iSn0xXbj.net] https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html d.hatena.ne.jp/yohhoy/touch/20120309/p1
647 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:00:55.78 ID:EfAk4eu6.net] >>633 C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。 (C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった) msvc では 2015 から。 c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる 以下を参照 https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization gcc / clang では -fno-threadsafe-statics オプション
648 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:06:23.94 ID:H8UzlwrM.net] 他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。 エラーの行番号見ても、あってるよーな?よくわからない。 どうすりゃいいの。
649 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:26:53.25 ID:MXcoXWvI.net] 独り言ならチラシの裏にかけ
650 名前:片山博文MZ mailto:sage [2018/04/18(水) 12:28:10.26 ID:iSn0xXbj.net] >>636 ソースとエラー貼って
651 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:39:00.98 ID:8LhMtFC1.net] >>638 NDAを結ばないと出せません
652 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:48:05.38 ID:Odk+F4n0.net] >>636 コードすら貼らないオツムの足りなさじゃ諦めろ
653 名前:633 mailto:sage [2018/04/18(水) 12:59:22.55 ID:uQo81sbZ.net] >>634-635 ありがとうございます。 VSは2015よりも前なので、このやり方はダメってことですね。 関数の外に置くようにします。 MFCの内部ではやっちゃってますが。
654 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:03:03.18 ID:H8UzlwrM.net] なんだよ。このクソ言語。やっとわかったわ。 ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。 エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。 ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。 hファイルにエラーがあるとかミスリードしてんじゃねぇよ。
655 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:07:10.12 ID:iSn0xXbj.net] エラーも貼れないなら、助けるのはムリ。 テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。 つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。
656 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:12:55.50 ID:H8UzlwrM.net] そりゃ、ソースコード全部張れば分かるとは思うけど、 エラーの内容は 「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」 みたいなエラーでて、この意味ぐらい自分で分かるし。 だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。 お手数かけました片山さん。
657 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:22:59.72 ID:iSn0xXbj.net] May the source be with you.
658 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:25:36.89 ID:whM0Cl8U.net] プリプロセッサの結果を見れば判るだろうに
659 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:37:08.45 ID:H8UzlwrM.net] そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が ありませんでした。 まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は 頻繁に数行書いたらコンパイルすることにします。
660 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:45:55.17 ID:MXcoXWvI.net] C++の文法のクソさには誰も異論はない。
661 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:59:47.30 ID:+aOsPa5t.net] プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな
662 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 14:01:11.21 ID:v7hqXOET.net] クソどころじゃない
663 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 15:30:25.37 ID:EU/tZBmZ.net] >>642 今後のためにそのエラーになる最少構成でやってみ
664 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 20:25:53.95 ID:hZhORVVR.net] ヘッダファイルがこんなふうにconst用と非const用の関数があるとして class A { B b; B& get() { return b; } const B& get() const { return b; } } このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか? auto& get() { return b; } auto& get() const { return b; }
665 名前:片山博文MZ mailto:sage [2018/04/18(水) 20:49:19.46 ID:cGcFIcRA.net] 型名が長すぎるときは、typedef。
666 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 20:52:50.32 ID:5Rgz0HeV.net] >>653 型の別名を定義することについての是非は置くとして、 typedef はオワコン。 using を使うのがモダンな C++ やで。
667 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 21:22:43.95 ID:hZhORVVR.net] typedefやusingはなるべく使いたくないんですよね やはりヘッダーの返り型くらいはちゃんと記述すべきですかね イタレータとか長くなりがちだけど・・・
668 名前:片山博文MZ mailto:sage [2018/04/18(水) 21:26:54.29 ID:cGcFIcRA.net] こうだな。動くかどうか知らんけど。 auto& get() { return b; } const auto& get() const { return b; }
669 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 21:27:07.88 ID:5Rgz0HeV.net] decltype(b) でもええんやで。
670 名前:デフォルトの名無しさん mailto:sage [2018/04/19(木) 01:18:42.72 ID:AYGORpen.net] 悩んでる時間があったら素直に全て書け と思う
671 名前:デフォルトの名無しさん [2018/04/24(火) 10:32:40.90 ID:Z9G2Fq/H.net] 柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?
672 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 12:27:26.17 ID:1D4v+3Mx.net] ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古 修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、 C++11/14 コア言語、江添 亮、2015
673 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 13:18:05.66 ID:+bGv0z3c.net] 「C++の設計と進化」は良いよ
674 名前:デフォルトの名無しさん [2018/04/24(火) 15:48:30.83 ID:Z9G2Fq/H.net] >>660-661 ありがとうございます。 Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。 柴田さんの中級という本も細かい話がないように思います。
675 名前:デフォルトの名無しさん [2018/04/24(火) 18:56:34.08 ID:Z9G2Fq/H.net] vector について質問です。 コピーコンストラクタ、operator= について一応勉強したのですが、 vector などのクラスでは、 コピーコンストラクタや operator= はどうなっているのでしょうか?
676 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:23:44.30 ID:4uyKjeBM.net] 実際にヘッダ読んで見るしかないと思うが ディープコピーしてるよとしか
677 名前:片山博文MZ mailto:sage [2018/04/24(火) 19:27:47.73 ID:Eukzbh8y.net] Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、 読み進めるにはテンプレートの知識が必要かもね。
678 名前:デフォルトの名無しさん [2018/04/24(火) 19:32:21.39 ID:Z9G2Fq/H.net] >>664 ありがとうございました。 ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、 関数から返したりしてもかまわないですね。 >>665 ありがとうございました。
679 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:40:11.28 ID:4uyKjeBM.net] >>666 それはディープコピーのコストがかさむのでおすすめしない
680 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:11:58.65 ID:Ukt80uX+.net] >>666 >何も考えず引数で渡しても良いですね 何をもってして「良い」と評価するのかはわかりませんが、 そういうのは拙い知識で独断せずそこら中にある 経験豊富な先人の書いたコードを読んで真似するのがいいですよ 引数は大抵 const 参照で渡しているでしょう
681 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 01:34:48.58 ID:Z7x9U0tp.net] class TestA { TestA() {} ~TestA() {} }; class TestB { TestB() {} ~TestB() {} TestA getA() { return TestA(); } }; int main() { TestB b; TestA a = b.getA(); } TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの インスタンスは一体どこで作られてるんでしょうか? TestA getA() { TestA a; return a; } としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
682 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:25:57.17 ID:E0/AuDcr.net] >>669 どこのメモリにどう作られているのかという質問だと思うけど、 C や C++ では式の値として構造体やオブジェクトが認められていて、 コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。 式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、 詳細はテンポラリーオブジェクトでぐぐって。 >>669 のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける ところで今回の質問の、関数の戻り値に関するコンパイラの動作は 「戻り値最適化」なる最適化によって色々複雑なことになっているので これは自分で戻り値最適化でググって調べて欲しい。