- 1 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 00:46:04.23 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part97 toro.2ch.net/test/read.cgi/tech/1343559275/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.79【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1341052801/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
- 10 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 14:01:34.43 ]
- 以下のコードが動くのは、環境依存ではなく、正しい挙動ですか
その場合const性を保つために暗黙的にコピー動作に変更されているということでしょうか これをエラーや警告を出すようにすることはできませんか 特にaut const std::wstring STRING = L"hoge"; void f(const std::wstring &s) {} const std::wstring & e() {return STRING;} int main() { f(L"hoge"); auto a = e(); a.push_back(L'a'); std::wstring s = e(); s.push_back(L'a'); }
- 11 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 14:41:49.34 ]
- >>10
そこコードのどこについてどんなエラーや警告を出したいの?
- 12 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:09:52.69 ]
- 仮想関数を持ったスーパークラスのポインタに派生クラスを入れて、
仮想関数を呼び出したいんだけどどうすればいいでしょうか? class SuperC{ virtual bool func()=0; }; class SubC{ virtual bool func(){ 何らかの処理 } }; int main(){ SuperC* super=new SubC(); return 1; } インスタンス化する予定はないのにSuperCのポインタは宣言できませんって言われる
- 13 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:10:33.85 ]
- class SubC:public SuperC{
です
- 14 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:11:10.51 ]
- public:
- 15 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:15:23.98 ]
- >>14
しにたいありがとう
- 16 名前:デフォルトの名無しさん [2012/08/25(土) 15:20:22.69 ]
- >>10
まずe()は、return STRING;であって return &STRING;ではないから、 e()の呼び出し毎にSTRINGがコピー(ていうか新規生成)されてそれがスタックに積まれて返される (中略) 以降は呼び出し元の勝手
- 17 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:22:37.97 ]
- STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
- 18 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 15:26:20.93 ]
- >>17
飽・き・た
- 19 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 16:51:07.33 ]
- >>16 e() の戻り値、参照ですよ。
- 20 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 16:54:23.47 ]
- auto&としない限り参照で受けないわな
- 21 名前:デフォルトの名無しさん [2012/08/25(土) 17:30:06.45 ]
- >>10
コピーをもろに要求する文脈だが? 変更なんかされてなく
- 22 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 17:38:57.11 ]
- 関数側で型を指定しているのにそれが無言でスルーされるのはどうなんだ
- 23 名前:デフォルトの名無しさん mailto:sage [2012/08/25(土) 17:59:56.08 ]
- ちょっと何言ってるかわかんないですねー
- 24 名前:16 mailto:sage [2012/08/25(土) 22:40:17.16 ]
- >>19
スマン恥ずかしすぎてちょっと吊ってきた
- 25 名前:デフォルトの名無しさん mailto:sage [2012/08/26(日) 02:14:03.65 ]
- >>10
>これをエラーや警告を出すようにすることはできませんか >10なコードでコピーが起きるのは、e()が参照を返した後の話なのでe()の対策ではできない エラーにしたいとしたら、STRINGをコピー不可能なクラスにすることが考えられる 例えば class wsrting2 : public std::wstring { private: wstring2(const wstring2&); /* delete */ }; というクラスを設け、>10なコードのstd::wstringをwstring2の置換する(std::wstringのかわりにwstring2を使う 他にもっと良い方法があるかもしれんが知らん
|

|