1 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:43:34 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
2 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:44:27 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq-lite/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] www.cppreference.com/ (英語) www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない) [禿 Stroustrup] public.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014 ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:44:42 ] ■Books(Templateまわり)■ Effective STL www.amazon.com/exec/obidos/ASIN/0201749629/ www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳) Modern C++ Design www.amazon.com/exec/obidos/ASIN/0201704315/ www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳) C++ Templates www.amazon.com/exec/obidos/ASIN/0201734842/ C++ Template Metaprogramming www.amazon.com/exec/obidos/ASIN/0321227255/
4 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:44:58 ] ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache STDCXX incubator.apache.org/stdcxx/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/ (日本語) www.wakhok.ac.jp/~sumi/stl/ [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
5 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:45:19 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
6 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:45:37 ] 前スレ C++相談室 part59 pc11.2ch.net/test/read.cgi/tech/1192866305/
7 名前:デフォルトの名無しさん [2008/01/11(金) 19:00:39 ] 復活か?
8 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:10:02 ] Prototype パターンに関する質問 派生させた、インスタンスの消滅(delete)は何処でやったらいい? 基底のデスクトラクタは、Effective C++ 新訂3版、宜しく virtualで宣言してるんだけど?
9 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:12:26 ] C++ Primer 4/E 買った奴いる? 内容はどうだった?
10 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:15:00 ] >>8 俺はstd::auto_ptrに突っ込んでいるが。
11 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:53:48 ] >>8 です とりあえず std::auto_ptr boost::shared_ptr は、なしで宜しくオナガイシマス
12 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:02:58 ] 同等のクラスを作れ
13 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:14:00 ] >>12 kuwasiku
14 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:18:29 ] おもっくそ真面目に作りたきゃ Modern C++ Design でも読めばいいが、 適当でいいなら適当なソース読め。
15 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:20:26 ] >>Modern C++ Designは持ってるが、読破できん >>適当でいいなら適当なソース読め。 どこにある?
16 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:41:09 ] boostなら落としてこい。 auto_ptrならコンパイラが持ってるかも知れん。検索しろ。 開発環境書かなきゃディレクトリなんてわかるか。
17 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:50:05 ] >>11 std::tr1::shared_ptrという抜け穴w
18 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:54:22 ] Loki のやつを使うという手も
19 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:08:13 ] >>8 だが LokiはModern C++ Designに載ってるライブラリだろうが なもん判るか、ぼけ ってゆうか、予想はしてたが、Prototype パターンで、派生させた、 インスタンスを消滅させるのって、やっかいなんだな
20 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:15:18 ] 読めと言ってる訳じゃねー
21 名前:デフォルトの名無しさん [2008/01/11(金) 21:28:03 ] 最大50桁の数字を2つ入力して その和と積と差を求めるプログラムを作りたいんだけど、 50桁も入力できない!!! 20桁もできない どうすれば入力できますか?
22 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:29:37 ] >>19 べつにPrototypeに限らん。 生成パターンで生成させたオブジェクトは皆同じ。 元々JavaとかC#に向いた手法だよな。
23 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:30:31 ] 多倍長演算でググれ
24 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:32:05 ] >>21 入力を文字列として読み取り、ひと桁ずつを配列に入れる。 あとはお前が筆算をやる要領でひと桁ずつ下の桁から加算する。 10を超えたら次の桁(=次の配列)に桁上げする。 単純だけど、こんなんでも一応実現できる。
25 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:41:12 ] >>21 マルチ 今宿題スレに行ってるな
26 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:48:00 ] >>19 >>22 へ 個人的な意見だが、ポインタ使って、ヒープにメモリ確保するのって 後始末が煩雑だから、嫌なんだよね、静的にインスタンスが、作れないものかな・・・
27 名前:デフォルトの名無しさん [2008/01/11(金) 22:16:52 ] >>25 宿題スレ行きました 出来れば助けてください!笑 >>29 ありがとうございます!!(ノ_・。)
28 名前:デフォルトの名無しさん [2008/01/11(金) 22:34:59 ] ↑上の 29じゃなくて >>24 のまちがいでした。。 あと、できればプログラム詳しく教えてほしいんですが(ノ_・。) 配列にいれて足していくってどうやればいいですか??? >>23 ぐぐります!!
29 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:12:53 ] >>28 マルチしてるのでどっちか取り下げないか? 助けてやろうにもどっちで助ければいい?
30 名前:デフォルトの名無しさん [2008/01/11(金) 23:20:49 ] じゃあ向こうのスレでお願いします!!
31 名前:デフォルトの名無しさん [2008/01/11(金) 23:23:23 ] マルチごめんなさい(ノ_・。)
32 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 11:05:00 ] More Effective C++ 新訂3版のテクニックという章に class NLComponent { virtual NLComponent * clone() const = 0 ; // クローンメソッド }; 基底クラスに、純仮想関数を宣言して、派生クラスでインスタンスを生成する方法が 載っているんだけど、一例で、ディスク上に保存されている、オブジェクトを std::istream strを引数にとるコンストラクタで渡してやってるんだけど これって、なんかおかしい気がする、理由は、コンストラクタで例外が起きたらどうなるんだ? どう思うよモマイラ
33 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 11:15:58 ] >>32 より 32の質問は却下します、スマン
34 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 17:50:36 ] >>33 おいおい、自分で書いておいて却下するなよ。
35 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 23:53:36 ] VC++ 2005を使っています。 テキストファイルから文字列を読み込んでいるのですが、CStdioFileなどを使った読み込みですと、1行ずつ読み込むしかありません。 これを、1行ではなく指定の区切り文字まで読み込む、というのをやりたいのです。 具体的に言うと、「。」がくるまで読み込みをやりたいと思っています。 今日は晴れです。明日も晴れです。 という文章を読み込む場合、最初の読み込み時では 今日は晴れです。 が読み込まれ、次の読み込みで 明日も晴れです。 が読み込まれるようにしたいと考えています。 何か標準のライブラリでこのようなものはないでしょうか? よろしくお願いします。
36 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:14:40 ] 1文字ずつ読み込んで、望みの区切り文字列が現れたところで止める。
37 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:35:49 ] >>35 getline(basic_istreamのメンバもグローバル関数のほうも)では、 \nに代わって区切る文字を指定できる。 ただし、元が改行文字を取り除く仕様なので、 当然指定した区切り文字は削除される。 std::wifstream is("hoge.txt"); is.imbue(std::locale("japanese")); std::wstring s1, s2; std::getline(is, s1, L'。'); std::getline(is, s2, L'。'); //s1 == L"今日は晴れです" //s2 == L"明日も晴れです"
38 名前:35 mailto:sage [2008/01/14(月) 01:58:54 ] >>37 どうも、ありがとうございます。それを使ってみたいと思います。
39 名前:デフォルトの名無しさん [2008/01/14(月) 21:44:28 ] Emacs にも Visual C++ の IntelliSense のような 入力支援機能を実現する Emacs Lisp プログラムが 用意されているのでしょうか? 単純なキーワード色づけは今も使っているのですが, もっと詳細な情報を得たいと思っています.
40 名前:デフォルトの名無しさん [2008/01/14(月) 23:51:44 ] C++及びオブジェクト指向初学者です(C++入門本一読程度) 。いくつかの クラスオブジェクト(CObjxx)を任意数包含する クラス(CTestxx)を複数生成 したいと考えています。 class CObjA {...}; // 既存クラス(修正不可) ・・・ class CObjD {...}; // 既存クラス(修正不可) class CTestA { private: CObjA m_objA; CObjB m_objB; }; class CTestB { private: CObjB m_objB; CObjC m_objC; }; ・・・ class CTestF { private: CObjA m_objA; CObjC m_objC; }; int main() { CTestA testA; ・・・ } 現在、このような実装で検討していますが、この方法だと各CTestxx毎に CObjxxに対するアクセサを 用意してあげる必要があり、かつ似たような 巨大なクラスCTestxxが出来上がってしまい、 スマートな実装ではない気が しています。。。 上記のようなケースは どのように実装するのが適切なのでしょうか。 ご教授をお願いします。
41 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:51:44 ] んー、それは言語系スレじゃなくてツール系スレに行くべきかな。
42 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:56:00 ] >>41 は>>39 へのレス >>40 抽象度が高すぎてなんともいえないな…。 CTestXXはラッパークラスなんかね? それとも唯のコンテナか…エスパーに任せる。
43 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:58:18 ] >>40 各Obj毎のアクセサクラス作って多重継承してみたら? class CObjAAccessors { public: objA用アクセサ; protected: CObjA m_objA; }; class CObjBAccessors { public: objB用アクセサ; protected CObjB m_objB; }; class CObjCAccessors { public: objC用アクセサ; protected: CObjC m_objC; }; class CTestA: public CObjAAccessors, public CObjBAccessors{}; class CTestB: public CObjBAccessors, public CObjCAccessors{}; ... class CTestF: public CObjAAccessors, public CObjCAccessors{};
44 名前:デフォルトの名無しさん [2008/01/15(火) 00:02:24 ] >>39 ある。無論標準装備ではない。
45 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:25:29 ] ある基底クラスと派生クラス群があって 格派生クラス群は固有タイプのパラメータ(intやdouble[2]とか)を持っているとする 開始関数Begin()を呼ぶ前にそれぞれ独自のパラメータを SetParameter(ParameterType[], int paramSize)で渡したい たとえば Derive1::PARAM param1[] = {3}; // int Derive2::PARAM param2[] = {0.9, 0.8}; // double[2] Derive1->SetParameter(param1, 1); Derive2->SetParameter(param2, 2); Derive1->Begin(); Derive2->Begin(); という感じ 現在これをテンプレートで実現してて (続く)
46 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:29:32 ] class Base{ void** param_; virtual bool Begin() = 0; public: Base() : param_(NULL){} template <class T> bool CreateParameter(T[], int); template <class T> void DeleteParameter(); template <class T> T GetParameter(int) const; }; template <class T> bool Base::CreateParameter(T param[], int n) { if(param_) return false; param_ = reinterpret_cast<void**>(new T*[n]); for(int i=0; i<n; i++) param_[i] = new T(param[i]); return true; } template <class T> void Base::DeleteParameter(){ delete[] reinterpret_cast<T**>(param_); param_ = NULL; } template <class T> T Base::GetParameter(int n) const{ return *(static_cast<T*>(param_[n])); } (続く)
47 名前:40 [2008/01/15(火) 00:55:05 ] 早々のご回答ありがとうございます。 >>42 初学ゆえ説明足らずで申し訳ありません。 CTestxxはCObjxxの機能を有するという形で実装したいと考えています。 CObjxxとCTestxxの間にラッパクラスを挟むべきか、それともよりよい 実装方法があるのか、そもそもCObjxxは包含すべきものなのか、 というところを悩んでいます。なんかうまく説明できなくてすみません。。。 >>43 なるほど。この方法だとCTestxxはCObjxxの機能を有しつつ、必要な部分だけを 公開できそうです。貴重なご意見ありがとうございます。
48 名前:デフォルトの名無しさん [2008/01/15(火) 02:16:35 ] gccでSJISファイルのコンパイルでうまくいかないので、ご教授いただけたらと思います。 > cat a.c #include "stdio.h" #define AAA(a) BBB(#a) void BBB(char *str) { printf("%s\n", str); } int main() { AAA(あ"い"); BBB("あ\"い\""); } > gcc --input-charset=cp932 --exec-charset=cp932 a.c > a.out あ"磚 あ"い" AAAの方とBBBの方で両方同じ結果が得られそうなのですが、 AAAの方でうまくいっていないのを解決したいと思っています。 ここでは標準出力していますが、内部文字コードはSJISのまま解決したいと思っています。 よろしくお願いいたします。
49 名前:デフォルトの名無しさん [2008/01/15(火) 08:34:52 ] >>41 >>44 THX ちょ,名前だけでもw といってもすれ違いの気もするから Emacs スレに行きます
50 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:27:52 ] >>48 --input-charsetじゃなくて-finput-charsetだった希ガス つーかすれ違い
51 名前:48 mailto:sage [2008/01/15(火) 23:53:54 ] >>50 ありがとうございます。 --input-charsetは-finput-charに展開されていたと思うので確か同じことだと思います。 GCCスレに同じ質問投げてきます。失礼しました。
52 名前:デフォルトの名無しさん [2008/01/16(水) 16:52:57 ] 下記のようにboost::arrayで代入演算子が定義されている型Tの2次元配列を で作りたいのですが、BOOST_PPとtemlateで一般化できないでしょうか? 自分でも考えたのですが脳みそが沸騰しそうでした。 struct Row : public boost::array<T, XSIZE> { Row(T x0, T x1,..., T xXSIZE_minus1) : boost::array<T, XSIZE>() {at(0) = x00; at(1) = x01;... at(XSIZE - 1) = xXSIZE_minus1; }; const boost::array<Row, YSIZE> plane = { Row(xx, xx, ... , xx), ... Row(xx, xx, ... , xx) };
53 名前:52 mailto:sage [2008/01/16(水) 16:56:53 ] 追記 const boost::array<Row, YSIZE> plane は手書きで初期化します。一般化したいのはRowだけです
54 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:57:59 ] 教えてください Borland社のフリーのコンパイラを使用してるのですが #defineをmakefileでのコンパイラ時に宣言するときはどのような記述がいるのでしょうか?
55 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 17:08:05 ] >>54 -D名前 -D名前=文字列
56 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 17:10:49 ] >>55 無事できました、ありがとうございます
57 名前:デフォルトの名無しさん [2008/01/17(木) 17:56:37 ] >>54-56 ほのぼのした.
58 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:25:38 ] さてさて初心者が通りますよ。 今日から勉強しようと今、Visual C++ 2008 Express Editionをインストール中。 ここまでOKです。
59 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:27:07 ] >>58 帰ってよし
60 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:44:30 ] >>58 お前すごいな! VC2008をインスコしたのか おれは、コンピラーすらインスコしてないよ コンピラーぐらい、OSにおまけで付けて欲しいよな
61 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 03:00:22 ] 最近の,NET Frameworkインストール済みなWindowsだと C#とかVB.NETのコンピラーがおまけで付いていますよ、と。
62 名前:デフォルトの名無しさん [2008/01/18(金) 10:03:24 ] 金毘羅ー
63 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:21:21 ] emacsでc++するためのリンクを集めているのですが d.hatena.ne.jp/niitsuma/20080114 他にも何か有用なサイトをご存じの方 お教えいただけると幸せです
64 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:16:25 ] pc11.2ch.net/test/read.cgi/unix/1194747953/
65 名前:デフォルトの名無しさん [2008/01/19(土) 18:29:00 ] C++好きですか?
66 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:33:18 ] Cのスーパーセットらしい →普通 クラスを使えると便利 →やや好き 難解な文法というか落とし穴にハマる →嫌いになる(この辺で多言語に浮気) テンプレートがわかってくる →再び好きになる STLに感動する →好きになる bind1stとかvalarrayに不満がでてくる →再びちょっと嫌いになる boostがわかってくる →また好きになる
67 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:03:21 ] TMPができるようになる →何でもいいので何か自作のライブラリを作りたくなる boostに追記/修正したくなる →何かを作る事よりもC++を書くこと自体が楽しくなる 既存のコンパイラに嫌気を射し C++コンパイラを自分で作りたくなる →ちょっと飽きてくる 巨大なプログラムを作成中に過去に自分の書いたコードが読めなくなる →PCを窓から投げ捨てたくなる
68 名前:引っ越してきました [2008/01/19(土) 20:17:46 ] VCスレからC++の問題ということで 追い出されて来ました。 クラスの中で+演算子を定義したいのですが、 newして、それをreturnの中で使いたいときに deleteできないで困っています。 どうしたらよいでしょうか。 ・簡単に言えば文字列の足し算です ・当方初心者です friend Mojiretsu operator+=(const Mojiretsu& moji1, const Mojiretsu& moji2) { // +演算子 int tmp_nagasa = moji1.nagasa + moji2.nagasa ; char* tmp_moji = new char[tmp_nagasa+1]; mojicpy(tmp_moji,moji1.s); mojicat(tmp_moji,moji2.s); return Mojiretsu(tmp_moji); } やりたいことはわかってもらえるとは思うのですが、 もっと楽にできるよとかもあったら教えてください。
69 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:23:50 ] いろいろとおかしいなw
70 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:24:06 ] Mojiretsu mojiretsu(tmp_moji); delete[] tmp_moji; return mojiretsu; でどう?
71 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:44:36 ] >>68 newしないでMojiretuを定義してそれをreturnすれば? Effective C++でもnewはするなと書いてあったぞ。
72 名前:68 [2008/01/19(土) 20:45:00 ] >>70 どうもです。 なるほど、コンストラクタを呼び出す、と。 実験の結果、ちゃんと動いています。 (まあ、もとのやつでも動いているようには 見えるのですが)
73 名前:68 [2008/01/19(土) 20:46:44 ] >>71 どうもです。 少々時間ください。初心者のため 理解するのに時間がかかりますので。
74 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:51:27 ] 例外安全・・・についてはまだ触れない方がいいか 混乱しそうだし
75 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:52:05 ] >>68 なんぜ+=なのに、moji1がconstなんだ? Mojiretsu s1("abc"), s2("def"); s1 += s2; これでs1 == "abcdef"にならないとおかしいだろ。
76 名前:68 [2008/01/19(土) 20:55:56 ] 訂正です。 ごめんなさい。 +=でなく、+です。
77 名前:68 [2008/01/19(土) 20:58:58 ] >>71 やっぱりわかりません。 もう少しヒントください。 あと、Effective C++のどの辺でしょうか。 そのうち読もうと買ってはあります。
78 名前:68 [2008/01/19(土) 21:00:50 ] >>74 とらいすろーきゃっち、でしょうか。 だいぶあとということでお願いします。
79 名前:68 [2008/01/19(土) 21:07:19 ] >>71 どこが分からないかというと、 Mojiretuを定義するには、 (コンストラクタに)文字列(char*)を 渡す必要がありますが、その文字列自体、 strcatした後のものにしなければならず、 どうどうめぐりのようで よく分からないのです。 勘違い、ご指摘くださいませ。
80 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:08:26 ] >>77 誰がdeleteの責任持つの?って言う事。 それとEffective C++は www.amazon.co.jp/Effective-%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%E3%80%91- %E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B8%E3%82%BD%E3%83%B3%E3%82%A6%E3 %82%A7%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E2%80%95Ascii-Addison-programming/dp/4756118089
81 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:09:09 ] deleteは関数内で済ませてしまった方がいいだろう
82 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:12:07 ] Effective C++持っているなら演算子の話を是非、 と思ったらMoreのほうだった……、22。 operator +よりもoperator +=を実装しろ。 そして、operator +はこうする。 Mojiretsu operator +(const Mojiretsu& lhs, const Mojiretsu& rhs) { Mojiretsu tmp(lhs); return tmp += rhs; }
83 名前:68 [2008/01/19(土) 21:16:53 ] >>82 どうもです。 実はMoreも持っています。 また実験してみます。 (時間がかかります)
84 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:22:53 ] std::vector使え
85 名前:68 [2008/01/19(土) 22:00:52 ] >>82 ありがとうございました! 動きました! +=を先に定義するというのは 頭いいですねえ。
86 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:12:44 ] 頭がいいっつうか、定石だな。
87 名前:68 [2008/01/19(土) 22:20:59 ] >>86 そういうものなんですね。 >>82 「More」の22の最初のページの一番下に 「単独演算子がfriendである必要はまったくない」と あり82でもfriendがついてませんが、friendにしないと、 lhsが"rerere"のような場合に私のではコンパイルエラーに なったのですが、まだ何かおかしいということでしょうか。
88 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:24:53 ] >>87 publicなコピーコンストラクタはあるか。 +=もメンバならやはりpublicになっている? 82のは、private/protectedなメンバに全く触っていないから friendにする必要がないという仕掛け。
89 名前:68 [2008/01/19(土) 22:32:41 ] >>88 たびたびありがとうございますです。 コピーコンストラクタも+=も+もその他すべての メンバ関数はpublicになっているのですが。。。
90 名前:68 [2008/01/19(土) 22:37:36 ] あ、もしかして、+は82そのままではなく、 privateメンバを触っていますがそのせいでしょうか。 Mojiretsu operator+(const Mojiretsu& str1, const Mojiretsu& str2) { // +演算子 String tmp_moji(str1.s); //←コンストラクタにはクラスの文字列部を渡してます tmp_moji += str2; return tmp_moji; }
91 名前:68 [2008/01/19(土) 22:57:13 ] friendがないと、 error C2804: binary 'operator +' に引数が多すぎます。 error C2333: 'Mojiretsu::operator +' : 関数宣言のエラーです。関数の本体は無視されます っていうのも出たため、実験しましたが、 どの+でもエラーになってます。。。 friendつけている限りまったくwarningさえも出ないのですが。 すいません、時間切れです、明日の夕方、また来ます。
92 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:19:33 ] >>91 来なくていいよ もっと勉強してから来い
93 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:26:25 ] >>91 迷惑です。もう荒らさないで下さい。
94 名前:68 [2008/01/20(日) 00:23:56 ] 大変おじゃまいたしました。 自己解決いたしました。 (error C2804でググって英文を読みました。 確かに読んでいる本ではコード上ちゃんと なっていますがはっきりと言葉では 書いてないんですよねー、、、) >>88 や、その他の方々、重ね重ねありがとうございました。 大変勉強になりました。
95 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:48:41 ] >>94 とりあえず次回のためには自己解決の意味を覚えとけ。
96 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 02:31:03 ] でもクラス定義内でfriend関数を定義できるのは盲点だったと思っている。
97 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 09:50:57 ] >>96 最初から知っていた俺がいる。 ただ、ADLでしかlookupできないというのは盲点だったと思っている。
98 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 11:39:38 ] slashdot.jp/it/07/05/24/2257258.shtml?tid=58 終わってるスキルtop10にCが入ってる c++と区別してcなのか、それともc++込みで終わってるのか
99 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:12:16 ] >>98 そいつバカですね。Cが終わってるなら、C++では重過ぎて 実装できない組み込み機器はどうなるのか?
100 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:31:48 ] アセンブラはリストされてないから大丈夫じゃないか?