C++相談室 part92
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/11/04(金) 01:58:02.00ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part91
http://hibari.2ch.net/test/read.cgi/tech/1315922506/
このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
ついでに壁紙にしてね。
http://www2.research.att.com/~bs/Bjarne.jpg
0002デフォルトの名無しさん
2011/11/04(金) 01:58:53.59[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://en.cppreference.com/w/cpp (英語)
http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2011/11/04(金) 01:59:43.54[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2011/11/04(金) 02:00:25.16amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005デフォルトの名無しさん
2011/11/04(金) 02:01:09.37Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006デフォルトの名無しさん
2011/11/04(金) 02:20:57.01http://codepad.org/
http://ideone.com/
0007デフォルトの名無しさん
2011/11/04(金) 07:40:38.35環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
地鎮祭終了>>1乙
0008デフォルトの名無しさん
2011/11/05(土) 12:49:24.510009デフォルトの名無しさん
2011/11/05(土) 19:50:36.17おつ
0010デフォルトの名無しさん
2011/11/05(土) 20:34:16.48http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
http://www2.research.att.com/~bs/Bjarne.jpg
0011デフォルトの名無しさん
2011/11/05(土) 23:55:51.530012デフォルトの名無しさん
2011/11/06(日) 01:51:28.660013デフォルトの名無しさん
2011/11/06(日) 15:39:49.29愛玩用人工知能KAZAMAを開発して地下室で生活してたのがバレた。
0014デフォルトの名無しさん
2011/11/06(日) 21:20:47.23俺あいつの語り口がけっこー好みなんだが入門いらね
0015デフォルトの名無しさん
2011/11/06(日) 22:00:17.240016デフォルトの名無しさん
2011/11/06(日) 22:24:07.01英語英語がたがた抜かすな。
コードは世界共通だ。
恐れることはない。
0017デフォルトの名無しさん
2011/11/07(月) 00:09:55.730018デフォルトの名無しさん
2011/11/07(月) 00:56:46.360019デフォルトの名無しさん
2011/11/07(月) 01:50:25.19public:
virtual void B(){
//何か
}
void C(){
B();
}
};
class exA:public A{
public:
void B(){
//何か
}
};
exA ex;
ex.C();//class AのB関数を呼ぶ。
exAのC()でclass AのB関数でなくclass exAのB関数を呼び出してもらいたいんだけど、
C関数をvirtualにしてexA関数で再定義する以外に方法ある?
0020デフォルトの名無しさん
2011/11/07(月) 01:56:02.79てか、親classから派生classの関数を呼び出す処理は往々にして糞だ。
0021デフォルトの名無しさん
2011/11/07(月) 01:59:16.200022デフォルトの名無しさん
2011/11/07(月) 02:00:20.97意図してる方法かしらんけど、
Cの中で、A::B();とすれば、AのB()が呼ばれるようになる。
ただし、派生先がどうであれ、B()は常にAのB();が呼ばれてしまう。
あとは、テンプレを使って、Type::B()の形式で呼び出すとか。
0023デフォルトの名無しさん
2011/11/07(月) 02:35:35.29糞ですまん。
C関数の中のB関数以降は全く同じ処理だから楽出来るかなとおもいまして。
>>21
ネーミングは気にしないでくれ。
>>22
template<class Func>
void C(){
Func::B();
};
こんな形ですか?
0024デフォルトの名無しさん
2011/11/07(月) 07:37:16.19そのソースで意図した動作ができてると思うんだけど、何か気に入らないの?
http://codepad.org/ENTqMxOP
0025デフォルトの名無しさん
2011/11/07(月) 07:58:56.010026デフォルトの名無しさん
2011/11/07(月) 09:43:22.64仮想関数の意味ないんじゃねこれじゃ
struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Base::put"); }
private:
virtual Base* duplicate_xxx () { return this; };
};
struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Derived::put"); }
private:
virtual Derived* duplicate_xxx () { return this; };
};
int main()
{
Base* b = new Derived;
Derived* d = new Derived;
b->put();
d->put();
delete d;
delete b;
}
0027デフォルトの名無しさん
2011/11/07(月) 10:14:33.26そのコードでどんな動作を期待してて何がどう変なんだ?
0028デフォルトの名無しさん
2011/11/07(月) 10:19:48.840029デフォルトの名無しさん
2011/11/07(月) 10:22:07.44duplicate()がスマートポインタを返す設計で使えるかも?
0030デフォルトの名無しさん
2011/11/07(月) 11:04:13.010031デフォルトの名無しさん
2011/11/07(月) 11:04:28.61仮想関数ならb->putでDerivedの方のput()を呼び出してくれるんじゃないのかい
0032デフォルトの名無しさん
2011/11/07(月) 11:20:23.170033デフォルトの名無しさん
2011/11/07(月) 12:05:24.51putが仮想関数ならそうだが>>26のputは仮想関数ではないしNVI使ってもないだろ。putにNVI使うなら
struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};
struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};
0034デフォルトの名無しさん
2011/11/07(月) 12:55:35.63サンクス
なるほどduplicateではなくてputをNVIイディオムにしなければいけないのでした
やろうとしていた事はduplicateが返したthisからputを呼び出す事でした
勘違いしてたようです
0035デフォルトの名無しさん
2011/11/07(月) 12:59:21.63二重にNVIを使わないといけないのか
#include <cstdio>
struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Base::put"); }
private:
virtual Base* duplicate_xxx () { return this; };
};
struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { std::puts("Derived::put"); }
private:
virtual Derived* duplicate_xxx () { return this; };
};
int main()
{
Base* b = new Derived;
Derived* d = new Derived;
b->duplicate()->put();
d->duplicate()->put();
delete d;
delete b;
}
0036デフォルトの名無しさん
2011/11/07(月) 13:01:44.70struct Base {
Base* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};
struct Derived : public Base {
Derived* duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Derived* duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};
int main()
{
Base* b = new Derived;
Derived* d = new Derived;
b->duplicate()->put();
d->duplicate()->put();
delete d;
delete b;
}
0037デフォルトの名無しさん
2011/11/07(月) 13:01:48.66MayersがPDF売ってるよ
0038デフォルトの名無しさん
2011/11/07(月) 13:58:15.69duplicateをどういうものにしたいのかわからないけど(Derived*を返す必要が本当にあるのか?)
基底クラスのpublicな非仮想メンバ関数を派生クラスで再定義・隠蔽するのはNVIではないよ
struct Base {
Base * duplicate () { return duplicate_xxx(); };
void put() const { put_(); }
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Base::put"); }
};
struct Derived : public Base {
private:
virtual Base * duplicate_xxx () { return this; };
virtual void put_() const { std::puts("Derived::put"); }
};
int main()
{
Base * b1(new Base);
Base * b2(new Derived);
Derived * d(new Derived);
b1->duplicate()->put();
b2->duplicate()->put();
d->duplicate()->put();
delete d;
delete b2;
delete b1;
}
0039デフォルトの名無しさん
2011/11/07(月) 14:54:27.17NVIと仮想関数の返す値を共変にするのを両立させたかったんです
やはり両立は無理ですかね?
0040デフォルトの名無しさん
2011/11/07(月) 17:14:17.92NVIは継承に関して不変だからムリだな
おとなしく仮想関数をインターフェースにしたほうがいいと思うよ
0041デフォルトの名無しさん
2011/11/07(月) 17:19:16.290042デフォルトの名無しさん
2011/11/07(月) 17:20:59.14いやここ見てたんですよ
http://d.hatena.ne.jp/tueda_wolf/20110125/p1
という事はこのブログは間違いですかね?
0043デフォルトの名無しさん
2011/11/07(月) 17:34:50.92もしもしなのでちょっと読んだだけだけど、これは単にそれっぽく隠蔽しただけなのでは……
仮想関数使った共変と振る舞いが一致しない場合があると思うんだけど
あと
>隠蔽(オーバーロード)
ってのは確実に誤りだな
0044デフォルトの名無しさん
2011/11/07(月) 17:43:46.05ありがとうございました
0045デフォルトの名無しさん
2011/11/07(月) 17:56:36.650046デフォルトの名無しさん
2011/11/07(月) 18:02:50.52どうせ返り値ってポインタだし、仮想関数で勝手に切り替えてくれるのですから
基底クラスへのポインタが返ればそれにNVIを適用すれば十分なはずです
0047デフォルトの名無しさん
2011/11/07(月) 23:12:21.62派生クラスメンバーの戻り値をコピーしたい場合。
Base b = object.OrverrideFunction(); //OrverrideFunctionは親の定義だとBase
Derived d = object.OrverrideFunction(); //共変の戻り値が使えないとコンパイルエラー
0048デフォルトの名無しさん
2011/11/07(月) 23:22:06.84そのobjectの型はDerivedなんでしょ?
だったら別にわざわざオーバーライドした関数呼ぶ必要ないじゃん
0049デフォルトの名無しさん
2011/11/07(月) 23:23:58.610050デフォルトの名無しさん
2011/11/07(月) 23:25:41.14struct Derived : Base {};
struct BaseObj { virtual Base & OverridedFunction(); };
struct DerivedObj { Derived & OverridedFunction(); };
DerivedObj object;
じゃあこういう状況?
0051デフォルトの名無しさん
2011/11/07(月) 23:27:19.72そういう話
0052デフォルトの名無しさん
2011/11/07(月) 23:35:22.88DerivedObjの型がわかってるなら仮想関数を使う必要性がないのでは?
まあべつに使ってもいいけどオーバーヘッド増えるからこうしたほうがいいでしょ
struct DerivedObj : BaseObj {
/*inline*/ Derived & NonOverrided();
virtual Derived & OverridedFunction() { return NonOverrided(); }
};
Derived d = object.NonOverrided();
0053デフォルトの名無しさん
2011/11/07(月) 23:40:32.75親クラスほっといて、子クラス単品で使う分にはオーバヘッドはない。
DerivedHolder object;
Deriverd d = object.OverrideFunction();
(BaseHolder*)にobjectを突っ込んでるわけじゃないのでインライン展開される
0054デフォルトの名無しさん
2011/11/07(月) 23:43:42.360055デフォルトの名無しさん
2011/11/08(火) 23:57:43.270056デフォルトの名無しさん
2011/11/09(水) 00:03:13.46他はあまり見ないな
0057デフォルトの名無しさん
2011/11/09(水) 01:20:06.02どういう原理か知らないけど。
0058デフォルトの名無しさん
2011/11/09(水) 01:25:44.270059デフォルトの名無しさん
2011/11/09(水) 01:51:38.78プライベートは「それを実装手段とする」
プロテクテッドは不明。
ってメイヤーが。
0060デフォルトの名無しさん
2011/11/09(水) 02:00:18.670061デフォルトの名無しさん
2011/11/09(水) 07:19:46.96メンバを公開しないだけじゃなく、
アップキャストとスライシングを禁止するために使える
0062デフォルトの名無しさん
2011/11/09(水) 09:57:08.590063デフォルトの名無しさん
2011/11/09(水) 10:36:30.86private に比べて何がうれしいの?
0064デフォルトの名無しさん
2011/11/09(水) 21:02:09.32class Base
{
protected:
virtual int Handle(void) = 0;
static int PeekHandle( Base &base ) { return Handle(); }
};
struct Derived:private Base
{
Derived( Base &base ){ int handle = PeekHandle( base );
};
privateならこういう使い方もある。
Derivedは他のBaseを覗き見るが、自分は見られないようにできる。
protected継承した場合は、その派生クラスがわざわざもう一回、
Baseを継承しなくて済むようになる。
0065デフォルトの名無しさん
2011/11/09(水) 21:49:59.60公開したいメンバをpublicでusingすれば
あとはそのままアクセス制限を継承できるからじゃね?
まあさらに継承しない場合は関係ないだろうけど
0066デフォルトの名無しさん
2011/11/09(水) 23:49:04.92ごめん private との違いが見えてこない。
0067デフォルトの名無しさん
2011/11/10(木) 00:52:32.65そういや、あのusingって何のためにあるんだっけ?
単に 親クラス::メンバー; って書いても同じだよね。
0068デフォルトの名無しさん
2011/11/10(木) 00:55:15.03に対するしどろもどろな顛末が using
0069デフォルトの名無しさん
2011/11/10(木) 01:04:18.25そういやprotected継承だと孫クラスが、thisを親クラスを引数にとる関数に渡せるって点がある。
private継承だと、孫と親は同じオブジェクトだと解っててもキャストできない。
親クラスを取る関数に孫を渡したいが、外部からむやみに親にアクセスされたくない場合に多少つかえる。
0070デフォルトの名無しさん
2011/11/10(木) 01:10:10.38ん? 親クラス::メンバー; じゃ孫からは、メンバーとみなされないってこと?
0071デフォルトの名無しさん
2011/11/10(木) 01:14:06.20protected データメンバ並みに要らんな。
0072デフォルトの名無しさん
2011/11/10(木) 01:14:32.490073デフォルトの名無しさん
2011/11/10(木) 02:41:42.270074デフォルトの名無しさん
2011/11/10(木) 02:53:20.98protectedデストラクタは必要だろ
0075デフォルトの名無しさん
2011/11/10(木) 02:55:37.000076デフォルトの名無しさん
2011/11/10(木) 03:05:35.650077デフォルトの名無しさん
2011/11/10(木) 09:15:07.29方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
0078デフォルトの名無しさん
2011/11/10(木) 12:35:07.45そういうのをpublicにするの?おかしいだろう
派生クラスにだけ公開すると機能は明確だし。必要な時だけ使えばいいんだし
0079デフォルトの名無しさん
2011/11/10(木) 13:51:48.52もともと private と public しかなく、後付けで追加したトリビアなんだから
0080デフォルトの名無しさん
2011/11/10(木) 14:16:34.87でも継承をサブクラスに限定するノーコストの方法も無い
よってprotectedはゴミ
0081デフォルトの名無しさん
2011/11/10(木) 14:18:46.97仕方なく使うもの。汚いことを自覚した上で。
0082デフォルトの名無しさん
2011/11/10(木) 14:31:16.80よってprotectedは生ゴミ
0083デフォルトの名無しさん
2011/11/10(木) 15:27:21.24まあそうなんだけど、大人の事情でって事あるじゃん
0084デフォルトの名無しさん
2011/11/10(木) 16:51:43.310085デフォルトの名無しさん
2011/11/10(木) 17:37:38.180086デフォルトの名無しさん
2011/11/10(木) 17:39:30.310087デフォルトの名無しさん
2011/11/10(木) 17:40:12.71>>74-75
0088デフォルトの名無しさん
2011/11/10(木) 17:44:06.950089デフォルトの名無しさん
2011/11/10(木) 19:50:26.59protectedメンバをprotectedメンバのままにしておきたい場合に
protected継承する事になる、ということ
private継承すると、protectedメンバをprotectedメンバのままにするには
protectedなとこで全部usingしないといけなくなる
0090デフォルトの名無しさん
2011/11/10(木) 20:05:20.150091デフォルトの名無しさん
2011/11/10(木) 21:07:08.160092デフォルトの名無しさん
2011/11/10(木) 23:53:35.57public にすれば機能が不明確になったり、必要でもないのに無理やり使わされたりするような
言い方だけど、そんなことはないよね。
0093デフォルトの名無しさん
2011/11/11(金) 00:13:50.03そのネタは通じなかったみたいだな
0094デフォルトの名無しさん
2011/11/11(金) 00:29:47.00乙女心は難しいよな
0095デフォルトの名無しさん
2011/11/11(金) 00:35:47.41財産は子供にだけ渡したい。
私の財産はみんなの共有物じゃない。
中途半端?
継承なんだから、親子関係と強欲具合で考えればいいんだよ
0096デフォルトの名無しさん
2011/11/11(金) 00:40:12.46知らない誰かがいくつでも勝手に追加するものを「子供」だなどと考えるのは無理があるだろう。
0097デフォルトの名無しさん
2011/11/11(金) 01:05:29.24ファイルスコープ限定して子の制約は出来るが。
尤も。protectedの用途(protected継承に限らず)は、
子に抽象化関数を実装することを義務付けた上で
機能提供することだろうがな。
0098デフォルトの名無しさん
2011/11/11(金) 01:07:46.810099デフォルトの名無しさん
2011/11/11(金) 01:09:07.16ファイルスコープ内を信用するなら public でもいいじゃん。
0100デフォルトの名無しさん
2011/11/11(金) 09:14:19.38子には公開できて孫には公開しないとか簡単にできるし
protectedでは簡単に間違いが起こってしまう
0101デフォルトの名無しさん
2011/11/11(金) 13:21:00.13■ このスレッドは過去ログ倉庫に格納されています