C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0578デフォルトの名無しさん
NGNGどのようにすればいいんでしょうか・・・
void Hage::OutLog(const char* fmt, ...)
{
va_list argp;
va_start(argp, fmt);
vfprintf(stdout, fmt, argp);
va_end(argp);
fprintf(stdout, "\n");
}
0579デフォルトの名無しさん
NGNGstd::string sss;
sss = "abc<TAB>bbb";
※<TAB>は制御コードのTABだと思ってください。
で、このストリングを、
sss.find();で見つけたいのですが、どうすればできますか?
そもそも、find()で制御コードを検索することってできるのでyそうか?
0580デフォルトの名無しさん
NGNG0582デフォルトの名無しさん
NGNG\
0583デフォルトの名無しさん
NGNG0584デフォルトの名無しさん
NGNG>※<TAB>は制御コードのTABだと思ってください。
嫌です。
0585デフォルトの名無しさん
NGNG典型的な宗教論争だね。2ch なら煽り入れて楽しむところだが。
058611063
NGNG>>580,>>585
そんなこと言ってないでお前らも参加しろよー
ほれ、よく言うじゃん、「踊る阿呆に、見る阿呆。同じ阿呆なら踊らにゃそんそん。」って。
0587デフォルトの名無しさん
NGNG触りたくないです
0589デフォルトの名無しさん
NGNG0590デフォルトの名無しさん
NGNGVC6のときにお世話になりますた。
0591デフォルトの名無しさん
NGNGその「踊る阿呆に・・・」って阿呆なのが前提じゃないと意味無いと思う。
0592デフォルトの名無しさん
NGNGたぶん放置されるはず。
0593デフォルトの名無しさん
NGNG0594デフォルトの名無しさん
NGNG0596デフォルトの名無しさん
NGNG「継承するとき、いちいち基底クラスのprivateな定義まで読みたくねーよ」
って事か。
俺もprivate virtual使いだけど、一理ないこともないかも。
0597デフォルトの名無しさん
NGNG見なくていい(普通の)privateとは分けて、しっかりコメントつけておかないと、
読み飛ばされる可能性が高いね。
ただ、C++使いとしては、アクセス指定とvirtual指定とが
まるで関係ないということは知っておいて欲しい。
public virtual を派生先で private にしてオーバーライドとか、
逆に private virtual を派生先で public にしてオーバーライドとか、
いくらでも有り得るし、相応の効果がある。
実際に役に立つかとか、良し悪しはまた別にして。
0598デフォルトの名無しさん
NGNGDoxygenのようなドキュメント生成ツールでは一般的にprivateなメンバは
ドキュメント化されない。
だからドキュメントを信じてコーディングすると予期せぬエラー
をうけることになるわけだ。だからprivate virtualはイクナイ。
でも、やる人の気持ちがわからないわけではない。
やるなら何らかの形で明示的に示してほしいなぁ。
0599デフォルトの名無しさん
NGNGそりゃDoxygenの問題だろ。提案すれば対応してもらえそう。
0600デフォルトの名無しさん
NGNG0601デフォルトの名無しさん
NGNGから、aaaaとbbbbを切り取って、それぞれstringに格納したいのですが、
いい方法はないでしょうか?
0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNGすぺしゃるさんくす!!!
0604デフォルトの名無しさん
NGNGありゃ? いいたいことが伝わんなかった…。
Doxygenでもprivateなメンバをドキュメントに含めさせることは可能なはず。
言いたいことはそれが可能かどうかではなくて、すべきでない場面が多々あるってこと。
例えばなんらかのライブラリを作って、それ用のAPIドキュメントを作るときは
privateなメンバを含めないでしょ、多分。
だって、それを使用するユーザは内部でのみ使用されるprivateなメンバを
意識する必要は無いし、しちゃいけない。
ところが、そのライブラリの中にprivate virtualな関数があると、ユーザ
privateな関数まで見てコーディングしなくちゃいけなくなる。
問題ありだよね?
0605デフォルトの名無しさん
NGNGC++ではprivateでもvirtualであればユーザーに関係有るんだから、
ドキュメント作るなら含めないといけないだろ。
Doxygenがそれには対応してないだけ。
private virtualが否定される理由としては理不尽。
0606デフォルトの名無しさん
NGNGtemplate メソッドの場合は、規定クラスの公開メソッドのドキュメントに
「派生クラスでこれこれのメソッドをオーバーライドすること」と書くから、
大差ないと思うが。
なんにしても、どっちでも良いよ、そんなの。
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指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
■ このスレッドは過去ログ倉庫に格納されています