C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0607デフォルトの名無しさん
NGNGそもそもprivate virtualの是非について話しているのに
>C++ではprivateでもvirtualであればユーザーに関係有るんだから、
という前提を持ち出すのも理不尽。
俺はprivateなのにユーザに関係することが問題だと思う。
多分、これはpublic, private等の捉え方の違いなのかな?
俺はクラスの使用者に対する可視性だと思っているから、privateなのに
使用者に見えることが気持ち悪い。
これを可視性ではなくてアクセス権として捉えるとprivate virtual肯定派
のいいたいことが理解出来る。
なんだかんだ言って
>>606
>なんにしても、どっちでも良いよ、そんなの。
に賛成。 消えます。
0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNGnothrow は最適化に使えるけど、他の例外指定って使う価値あるか?
未処理例外で死ぬか、terminate() で突然死するか程度の差しか無いような。
C++はデフォルトの例外指定が throw(...) なので
一箇所でも指定していない関数があると誓約が途切れてしまうし。
0610デフォルトの名無しさん
NGNGvoid hoge(){ throw; }
set_unexpected( hoge );
で
0611デフォルトの名無しさん
NGNGclass C
{
...
struct CImpl;
CImpl* pimpl_;
};
を
class C
{
...
struct CImpl* pimpl_;
};
と書く事って認められてるんですか?VC7.1じゃコンパイル通んないんですが…
0612611
NGNGstruct C::CImpl{ ... }
ってやるとです。。
0613デフォルトの名無しさん
NGNGCImplはどこで定義してんの?
0614デフォルトの名無しさん
NGNG;が抜けてるけど,それがCImpl(Cのインナークラス)の定義ってことなんでしょう.
gccだとこんな感じ.規格では???
class C {
struct CImpl; // (a)
CImpl* pimpl_; // (a)
struct CImpl* pimpl_; // (b)
};
struct C::CImpl {}; // (1)
struct CImpl {}; // (2)
(a)-(1) ○
(b)-(1) ×
(a)-(2) ○
(b)-(2) ○
0615デフォルトの名無しさん
NGNGExceptional C++ では通して
(b)-(1)
の形式で書かれてるのですが、規格ではどんなもんでしょう…
0616デフォルトの名無しさん
NGNGこれは宣言じゃないんだから、
b-1が不可能なのは当然でない?
0617デフォルトの名無しさん
NGNGその説明だと本来は(b)-(2)も通っちゃいけないってこと?
0618デフォルトの名無しさん
NGNGvirtualなデータメンバって何故できないのでしょうか?
あれば便利だとおもうのですが。
0619デフォルトの名無しさん
NGNGたとえばどんな感じに使いたい?
0620デフォルトの名無しさん
NGNGテンプレートクラスって知ってるよね?
0621デフォルトの名無しさん
NGNGいったいどういう挙動をするものなのか、まるで思いつかない。
protectedメンバ変数とか、参照を返すvirtual関数で満たされないものなのか?
0622デフォルトの名無しさん
NGNG(b)-(2)は(2)で宣言と定義を同時に行ってるんだから、問題ない。
0623デフォルトの名無しさん
NGNG参照を返す virtual メソッドで我慢しとき。
0625デフォルトの名無しさん
NGNG> Exceptional C++は誤植なのかもしれないですね.
例えば何ページ?
0626618
NGNG// あるライブラリで定義されてるクラス
class B {}
class B1 : public B {}
class B2 : public B {}
// 自分のクラス
class A
{
vritual B b:
void proc(){ b に対して色々な処理}
}
class A1 : public A { B1 b1;}
class A2 : public A { B2 b2;}
みたいな感じです。
>>623
>参照を返す virtual メソッドで我慢しとき。
この方法がよさげなので、ためして見ます。m(_ _)m
0627デフォルトの名無しさん
NGNGclass B { virtual void age() = 0; };
class B1 : public B { void age() { fusianasan(); } };
class B2 : public B { void age() { mokorimoko(); } };
class A
{
B* sage;
void proc() { sage->age(); }
};
class A1 : public A { A1() { sage = new B1; } };
class A2 : public A { A2() { sage = new B2; } };
0628618
NGNGあ〜あ〜ぁあ〜ぁあ〜ぁあぁ。正にその通りです。
最初からインスタンス作ろうしたからダメなんだ。orz
muchas gracias、merci beaucoup、danke schon、grazie mille、非常感謝
0629デフォルトの名無しさん
NGNG上が class C 内に struct CImpl を宣言している。
下がグローバル名前空間に struct CImpl を宣言している。
初めて class/struct XXXX の形で現れた名前の宣言されるスコープは、
それが他の宣言中に含まれるか、単体で文になっているかで変わるらしい。
詳しくは規格の 3.3.1 -5- 。
ちなみに friend 宣言のときはまた別のルールになる。
0630デフォルトの名無しさん
NGNGclass A
{
virtual B& sage() = 0;
void proc() { sage().age(); }
};
こっち(参照を返す virtual メソッド)のほうがいいと思う。
0632デフォルトの名無しさん
NGNGポインタを保持するサイズが節約できる。
(>>627の例ではvtableと相殺するが、たぶんAにはvirtualなデストラクタが必要だろう。)
所有権の混乱を避ける。
(>>627のコードでnewしたB1,B2をだれがdeleteするべきなのか不明。)
ポインタへの代入忘れを防げる。
0634デフォルトの名無しさん
NGNG本当にそれがネックになるケースは、プログラム効率で有名な話の8:2より
はるかに小さいんだから、あんま気にしてもしょーがないだろ
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNG" - "のような、空白を含む文字列を正しく検索するにはどうしたらいいでしょうか?
string sss = "100-100";
sss.find(" - ");
で検索すると、検索できてしまうのです・・・ORX
0637デフォルトの名無しさん
NGNG見つからなかった時の戻り値が string::npos だってのは知ってる?
0638デフォルトの名無しさん
NGNG↑顔文字に見える
0639デフォルトの名無しさん
NGNG- STLPort4.6.2
0641デフォルトの名無しさん
NGNG0642デフォルトの名無しさん
NGNGはっとりくんの弟に似てんな。
0643デフォルトの名無しさん
NGNGもまえの友達の弟なんて知らん。
0644デフォルトの名無しさん
NGNG「検索できてしまう」って、 find() の戻り値はどうなってたの?
0645デフォルトの名無しさん
NGNGstd::string nlp( " -" );
std::search( sss.begin(), sss,end(), nlp.begin(), nlp.end() ) == sss.end();
これでは?
0646デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGしんぞー
0649デフォルトの名無しさん
NGNG0650デフォルトの名無しさん
NGNG検索されなかったって言っただろ。
いや、検索は出来たな。マッチはしなかったけど。
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNG仕様のバージョンとかリビジョンならあるんだろうけど(auto_ptrとか)
番号がついてるかはわからん。
0653デフォルトの名無しさん
NGNGSTLのバージョンってVC++のバージョンそのものじゃないの?
私の認識では、STLはVC++そのものということになっている。
0654デフォルトの名無しさん
NGNG0656マイク ◆yrBrqfF1Ew
NGNGどうなるんだろうな?
0657デフォルトの名無しさん
NGNG使ってるコンパイラで↓のプログラムの実行結果を確認してください。
ちなみに g++ (GCC) 3.3.3 (cygwin special) では not found になります。
#include <string>
#include <iostream>
int main()
{
std::string s = "100-100";
std::string::size_type p = s.find(" - ");
if( p != std::string::npos ) std::cout << p << std::endl;
else std::cout << "not found" << std::endl;
return 0;
}
0658デフォルトの名無しさん
NGNG0659657
NGNGお?そういえば前はそうだったような気がします。
でもこれは g++ --version からコピペしてます。
こないだ入った更新をインストールしたから、それで変わったのかもしれません。
0660デフォルトの名無しさん
NGNG自分の環境でためしたところ、not foundになりました。
findでは空白文字を含む文字列の検索は正しくできるけど、
find_last_ofは、空白文字を含む文字列の検索は正しくされないのでしょうか?
0661デフォルトの名無しさん
NGNGなんで>>636の時点で find_last_of() と書かなかった?
find_last_of() の仕様知ってるのか?
欲しいのは rfind() じゃないか?
0662デフォルトの名無しさん
NGNG0663662
NGNG0664デフォルトの名無しさん
NGNG救えねぇやつ。
なんか ttp://www8.ocn.ne.jp/~tsugaru3/shakkinn1.htm これを思い出しちまったよ。
0665デフォルトの名無しさん
NGNGinline T* Create()
{
return new T;
}
こんな感じの関数を見たんですけどこれはどうやって呼び出すんですか?
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNGほーなるほどありがとう
0668デフォルトの名無しさん
NGNGint *じゃなくてT *でしょ?
0669デフォルトの名無しさん
NGNGなにいってんの?
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG0673デフォルトの名無しさん
NGNG神様、ありがとうございますぅ^_~
0674デフォルトの名無しさん
NGNGテストコードを実装できるスキルがまだないので教えてください。
0675デフォルトの名無しさん
NGNGスキルがないんだったら今知らなくてもいいこと
答えは出来ません
非仮想関数の再定義が起こるようなら設計を見直すべき
0676デフォルトの名無しさん
NGNGありがとうございます。
不安なら現時点ではvirtual指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
0677デフォルトの名無しさん
NGNGという理解はお勧めしない。
virtual になれないメンバや virtual が効かない場面で
かえって深い混乱の原因になるからだ。
根を理解せずに使いたい人には C++ は向かない。ここを忘れるな。
0678デフォルトの名無しさん
NGNGそもそも、やたらと継承するな。てきとーに設計して、てきとーに継承するから
オーバーライドできるか否かで悩むことになる。
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNGオーバーライドされる可能性があるメンバ関数と、未来永劫絶対にオーバーライドされない
メンバ関数を見分ける方法があったら教えてください。状況に依存とかいうのはナシの方向で。
0681デフォルトの名無しさん
NGNG0682680
NGNGこういう疑問って無用なのかな・・・?
0683デフォルトの名無しさん
NGNG自分が今何を作っているのかを考えたら答えでるだろうが
0684680
NGNG0685デフォルトの名無しさん
NGNGいや、ご尤もな質問だぞ?
本気で聞くがまじめに考えたことあるか?? いや現在形で考えてるか?
0686デフォルトの名無しさん
NGNG糞言語なので、ありません。
0687デフォルトの名無しさん
NGNG>>683
0688デフォルトの名無しさん
NGNG死ねJava厨
0689デフォルトの名無しさん
NGNG設計なんか考えたこともない奴隷は気楽でいいよなw
0690デフォルトの名無しさん
NGNG何でそこで Java が出てくるんだよスカタン
0691デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1077985164/27
昔の疑問↑が解決したっ!ありがとうございました!
0692デフォルトの名無しさん
NGNGdat落ちしているスレッドにリンクを貼っても見られないから、コピペしてくれ。
0693デフォルトの名無しさん
NGNG27 名前:デフォルトの名無しさん 投稿日:04/02/29 16:48
当方、以下のコードが通りません。どこが悪いかご指摘願います。
Metrowerks CodeWarrior 8.2 Pro for Winを使っております。
(hello.cpp)
class hoge
{
public:
hoge();
~hoge();
private:
struct impl* pimpl_;
};
struct hoge::impl{};
hoge::hoge() : pimpl_(new impl){}
hoge::~hoge(){delete pimpl_;}
int main()
{
hoge hage;
return 0;
}
0694デフォルトの名無しさん
NGNG(メッセージ)
エラー: 宣言シンタックスエラー
hello.cpp 行: 9 struct hoge::impl{};
エラー: 宣言シンタックスエラー
hello.cpp 行: 10 hoge::hoge() : pimpl_(new impl){}
警告: 不完全な struct/union/class 'impl' の使い方が不当です。
hello.cpp 行: 11 hoge::~hoge(){delete pimpl_;}
ちなみに
struct impl;
impl* pimpl_;
とあらかじめ宣言すれば通ります。
0695デフォルトの名無しさん
NGNGググっても出てこねぇ…
0696デフォルトの名無しさん
NGNG過去ログ見たが、その書き込みから30分で>>629と同じ答えが出てないか?
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGサンクス!
0700691
NGNGglobalでどのようなときにinner classなのか、また規格のどこに
根拠があるかがはっきりしたということで。
0701デフォルトの名無しさん
NGNG本一冊を通してコンパイラを通らない規格外のコードを載せてたことになるが
0702デフォルトの名無しさん
NGNGいや、はっきりしてただろ。
28 名前:デフォルトの名無しさん[sage] 投稿日:04/02/29 17:16
>>27
'struct impl'の形はelaborated-type-specifierといって、でてくる文脈によって働きが微妙に異なる。
struct impl;
とかくと、そのスコープでimplが宣言され、
struct impl* pimpl_;
とかくと、「そのスコープを含む、最も内側の、非クラス、且つ、非関数宣言の」スコープ(この場合はグローバル名前空間)
でimplが宣言されたことになる。
詳しくは規格の3.3.1の5を参照すべし
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0703デフォルトの名無しさん
NGNG0704デフォルトの名無しさん
NGNG・参照はリンクリストで管理(使用に付随するnewや埋め込みカウントが無い。)
・スマートポインタ間での自動アップキャスト可能
・明示指定時のみスマートポインタ間でダウンキャスト可能
・関数内定義クラスのポインタのハンドリング可能
なんか最後のが無理っぽい気もするんですが、どうなんでしょう?
0705デフォルトの名無しさん
NGNG0706704
NGNG最初の条件は
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm
こういう意味でした。
■ このスレッドは過去ログ倉庫に格納されています