トップページ⇒tech
1001コメント302KB

C++相談室 part34

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0577アイク ◆uCUYQ8/A2w NGNG
>>575
トリップパクんなタコ

>>576
ほんたまとマイクは死んだほうがいいよな
0578デフォルトの名無しさんNGNG
以下の関数を修正して、標準出力ではなくて、st::stringに出したいのですが、
どのようにすればいいんでしょうか・・・

void Hage::OutLog(const char* fmt, ...)
{

va_list argp;
va_start(argp, fmt);
vfprintf(stdout, fmt, argp);
va_end(argp);
fprintf(stdout, "\n");
}
0579デフォルトの名無しさんNGNG
std::stringにタブがあるかどうかを調べるにはどうすればいいですか?

std::string sss;

sss = "abc<TAB>bbb";

※<TAB>は制御コードのTABだと思ってください。

で、このストリングを、

sss.find();で見つけたいのですが、どうすればできますか?
そもそも、find()で制御コードを検索することってできるのでyそうか?
0580デフォルトの名無しさんNGNG
cppllでつまんねえ喧嘩してるぞ。どっちもどっちだな。傍から見ていると。
0581アイク ◆uCUYQ8/A2w NGNG
>>578
vsprintfでも使え

>>579
if(sss.find('\t')!=std::string::npos)//見つかった
0582デフォルトの名無しさんNGNG
>>579
\
0583デフォルトの名無しさんNGNG
>>578 vsnprintf
0584デフォルトの名無しさんNGNG
>>579
>※<TAB>は制御コードのTABだと思ってください。

嫌です。
0585デフォルトの名無しさんNGNG
>>580
典型的な宗教論争だね。2ch なら煽り入れて楽しむところだが。
058611063NGNG
11056 にはビックリしますた。

>>580,>>585
そんなこと言ってないでお前らも参加しろよー
ほれ、よく言うじゃん、「踊る阿呆に、見る阿呆。同じ阿呆なら踊らにゃそんそん。」って。
0587デフォルトの名無しさんNGNG
その阿呆と違って本物の阿呆だから
触りたくないです
058811063NGNG
>>587
漏れにレスしたのは触ったことにならんの?
お前も阿呆、決定。
0589デフォルトの名無しさんNGNG
国語能力なさ過ぎ
0590デフォルトの名無しさんNGNG
道化師さんキター?
VC6のときにお世話になりますた。
0591デフォルトの名無しさんNGNG
>>586
その「踊る阿呆に・・・」って阿呆なのが前提じゃないと意味無いと思う。
0592デフォルトの名無しさんNGNG
11063は、背伸びしすぎだな。
たぶん放置されるはず。
0593デフォルトの名無しさんNGNG
cppllの話題なぞ持ち込まんでくれよ
0594デフォルトの名無しさんNGNG
キモヲタ同盟に名称変更希望。
059511063NGNG
>>590
以前からちょこちょこ書き込んでますよー
なんかスレ汚しになっちゃったんでお暇しますー

|ω・)ノシ お休みなさいー
0596デフォルトの名無しさんNGNG
要するに
「継承するとき、いちいち基底クラスのprivateな定義まで読みたくねーよ」
って事か。
俺もprivate virtual使いだけど、一理ないこともないかも。
0597デフォルトの名無しさんNGNG
>>private virtual
見なくていい(普通の)privateとは分けて、しっかりコメントつけておかないと、
読み飛ばされる可能性が高いね。

ただ、C++使いとしては、アクセス指定とvirtual指定とが
まるで関係ないということは知っておいて欲しい。
public virtual を派生先で private にしてオーバーライドとか、
逆に private virtual を派生先で public にしてオーバーライドとか、
いくらでも有り得るし、相応の効果がある。
実際に役に立つかとか、良し悪しはまた別にして。
0598デフォルトの名無しさんNGNG
>> private virtual @ cppll
Doxygenのようなドキュメント生成ツールでは一般的にprivateなメンバは
ドキュメント化されない。
だからドキュメントを信じてコーディングすると予期せぬエラー
をうけることになるわけだ。だからprivate virtualはイクナイ。

でも、やる人の気持ちがわからないわけではない。
やるなら何らかの形で明示的に示してほしいなぁ。
0599デフォルトの名無しさんNGNG
>>598
そりゃDoxygenの問題だろ。提案すれば対応してもらえそう。
0600デフォルトの名無しさんNGNG
VC8、未だに例外仕様はnothrowしか出来ねぇ_| ̄|○
0601デフォルトの名無しさんNGNG
string ss = "aaaabbbb";

から、aaaaとbbbbを切り取って、それぞれstringに格納したいのですが、
いい方法はないでしょうか?
0602デフォルトの名無しさんNGNG
>>601 std::string::substr()
0603デフォルトの名無しさんNGNG
>>602
すぺしゃるさんくす!!!
0604デフォルトの名無しさんNGNG
>>599
ありゃ? いいたいことが伝わんなかった…。
Doxygenでもprivateなメンバをドキュメントに含めさせることは可能なはず。
言いたいことはそれが可能かどうかではなくて、すべきでない場面が多々あるってこと。

例えばなんらかのライブラリを作って、それ用のAPIドキュメントを作るときは
privateなメンバを含めないでしょ、多分。
だって、それを使用するユーザは内部でのみ使用されるprivateなメンバを
意識する必要は無いし、しちゃいけない。

ところが、そのライブラリの中にprivate virtualな関数があると、ユーザ
privateな関数まで見てコーディングしなくちゃいけなくなる。
問題ありだよね?
0605デフォルトの名無しさんNGNG
>>604
C++ではprivateでもvirtualであればユーザーに関係有るんだから、
ドキュメント作るなら含めないといけないだろ。

Doxygenがそれには対応してないだけ。
private virtualが否定される理由としては理不尽。
0606デフォルトの名無しさんNGNG
>>604
template メソッドの場合は、規定クラスの公開メソッドのドキュメントに
「派生クラスでこれこれのメソッドをオーバーライドすること」と書くから、
大差ないと思うが。

なんにしても、どっちでも良いよ、そんなの。
0607デフォルトの名無しさんNGNG
>>605
そもそもprivate virtualの是非について話しているのに
>C++ではprivateでもvirtualであればユーザーに関係有るんだから、
という前提を持ち出すのも理不尽。

俺はprivateなのにユーザに関係することが問題だと思う。
多分、これはpublic, private等の捉え方の違いなのかな?
俺はクラスの使用者に対する可視性だと思っているから、privateなのに
使用者に見えることが気持ち悪い。

これを可視性ではなくてアクセス権として捉えるとprivate virtual肯定派
のいいたいことが理解出来る。

なんだかんだ言って
>>606
>なんにしても、どっちでも良いよ、そんなの。
に賛成。 消えます。
0608デフォルトの名無しさんNGNG
なんだ、せっかく飛び火したのにもう鎮火したのか?
0609デフォルトの名無しさんNGNG
>>600
nothrow は最適化に使えるけど、他の例外指定って使う価値あるか?
未処理例外で死ぬか、terminate() で突然死するか程度の差しか無いような。
C++はデフォルトの例外指定が throw(...) なので
一箇所でも指定していない関数があると誓約が途切れてしまうし。
0610デフォルトの名無しさんNGNG
>>609
void hoge(){ throw; }
set_unexpected( hoge );
で
0611デフォルトの名無しさんNGNG
C++ って、
class C
{
...
    struct CImpl;
    CImpl* pimpl_;
};
を
class C
{
...
    struct CImpl* pimpl_;
};
と書く事って認められてるんですか?VC7.1じゃコンパイル通んないんですが…
0612611NGNG
あ、コンパイラ通らないってのは
struct C::CImpl{ ... }
ってやるとです。。
0613デフォルトの名無しさんNGNG
struct C::CImpl {} <-なにこれ?

CImplはどこで定義してんの?
0614デフォルトの名無しさんNGNG
>>613
;が抜けてるけど,それが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デフォルトの名無しさんNGNG
>>614
Exceptional C++ では通して
(b)-(1)
の形式で書かれてるのですが、規格ではどんなもんでしょう…
0616デフォルトの名無しさんNGNG
struct CImpl* pimpl_;
これは宣言じゃないんだから、
b-1が不可能なのは当然でない?
0617デフォルトの名無しさんNGNG
>>616
その説明だと本来は(b)-(2)も通っちゃいけないってこと?
0618デフォルトの名無しさんNGNG
質問です。
virtualなデータメンバって何故できないのでしょうか?
あれば便利だとおもうのですが。
0619デフォルトの名無しさんNGNG
ちょっと「便利な状況」が思い付かないなぁ。
たとえばどんな感じに使いたい?
0620デフォルトの名無しさんNGNG
>>618
テンプレートクラスって知ってるよね?
0621デフォルトの名無しさんNGNG
>618
いったいどういう挙動をするものなのか、まるで思いつかない。
protectedメンバ変数とか、参照を返すvirtual関数で満たされないものなのか?
0622デフォルトの名無しさんNGNG
>>617
(b)-(2)は(2)で宣言と定義を同時に行ってるんだから、問題ない。
0623デフォルトの名無しさんNGNG
>>618
参照を返す virtual メソッドで我慢しとき。
0624617NGNG
>>622
なるほど.616を理解できました.

>>615
Exceptional C++は誤植なのかもしれないですね.
0625デフォルトの名無しさんNGNG
>>624
> Exceptional C++は誤植なのかもしれないですね.

例えば何ページ?
0626618NGNG
みなさん、いろいろ意見ありがとうございます。やりたいことはこんな感じです

// あるライブラリで定義されてるクラス
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デフォルトの名無しさんNGNG
>>626
class 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; } };
0628618NGNG
>>627
あ〜あ〜ぁあ〜ぁあ〜ぁあぁ。正にその通りです。
最初からインスタンス作ろうしたからダメなんだ。orz

muchas gracias、merci beaucoup、danke schon、grazie mille、非常感謝
0629デフォルトの名無しさんNGNG
>>611
上が class C 内に struct CImpl を宣言している。
下がグローバル名前空間に struct CImpl を宣言している。

初めて class/struct XXXX の形で現れた名前の宣言されるスコープは、
それが他の宣言中に含まれるか、単体で文になっているかで変わるらしい。

詳しくは規格の 3.3.1 -5- 。
ちなみに friend 宣言のときはまた別のルールになる。
0630デフォルトの名無しさんNGNG
>>627
class A
{
 virtual B& sage() = 0;
 void proc() { sage().age(); }
};

こっち(参照を返す virtual メソッド)のほうがいいと思う。
0631アイク ◆uCUYQ8/A2w NGNG
>>630
なぜそっちがいいと思うの?
0632デフォルトの名無しさんNGNG
>>631
ポインタを保持するサイズが節約できる。
(>>627の例ではvtableと相殺するが、たぶんAにはvirtualなデストラクタが必要だろう。)
所有権の混乱を避ける。
(>>627のコードでnewしたB1,B2をだれがdeleteするべきなのか不明。)
ポインタへの代入忘れを防げる。
0633アイク ◆uCUYQ8/A2w NGNG
>>632
大したメリットが無いな。

sageオブジェクトが必要な時に、毎回仮想関数経由での取得による速度低下の方が俺は心配だ。
0634デフォルトの名無しさんNGNG
仮想関数での速度低下は都市伝説
本当にそれがネックになるケースは、プログラム効率で有名な話の8:2より
はるかに小さいんだから、あんま気にしてもしょーがないだろ
0635デフォルトの名無しさんNGNG
実装やテストの効率を気にしたほうがいいな
0636デフォルトの名無しさんNGNG
std::stringクラスのfindメソッドで" - "を検索したいのに、"-"として検索されるみたいです。
" - "のような、空白を含む文字列を正しく検索するにはどうしたらいいでしょうか?


string sss = "100-100";

sss.find(" - ");

で検索すると、検索できてしまうのです・・・ORX
0637デフォルトの名無しさんNGNG
>>636
見つからなかった時の戻り値が string::npos だってのは知ってる?
0638デフォルトの名無しさんNGNG
(" - ")
↑顔文字に見える
0639デフォルトの名無しさんNGNG
検索されないけど。
- STLPort4.6.2
0640デフォルトの名無しさんNGNG
>>636
そういうメソッドなんだろ。
自分で作りこめ。

>>637
文章よく嫁

0641デフォルトの名無しさんNGNG
strstr(sss.c_str()," - ");
0642デフォルトの名無しさんNGNG
>>638
はっとりくんの弟に似てんな。
0643デフォルトの名無しさんNGNG
>>642
もまえの友達の弟なんて知らん。
0644デフォルトの名無しさんNGNG
>>636
「検索できてしまう」って、 find() の戻り値はどうなってたの?
0645デフォルトの名無しさんNGNG
std::string sss( "100-100" );
std::string nlp( " -" );

std::search( sss.begin(), sss,end(), nlp.begin(), nlp.end() ) == sss.end();

これでは?
0646デフォルトの名無しさんNGNG
>>645 なにそれ?
0647デフォルトの名無しさんNGNG
>>644
戻り値は"-"のある場所の3です。

>>643
はっとりくんって忍者はっとりくんのことじゃないですか?
0648デフォルトの名無しさんNGNG
>>647
しんぞー
0649デフォルトの名無しさんNGNG
実際にコードを書いた人は無視
0650デフォルトの名無しさんNGNG
>>647
検索されなかったって言っただろ。
いや、検索は出来たな。マッチはしなかったけど。
0651デフォルトの名無しさんNGNG
恥ずかしいんだけど、STLのバージョンってどう調べるの?
0652デフォルトの名無しさんNGNG
製品によって違うし

仕様のバージョンとかリビジョンならあるんだろうけど(auto_ptrとか)
番号がついてるかはわからん。
0653デフォルトの名無しさんNGNG
>>651
STLのバージョンってVC++のバージョンそのものじゃないの?
私の認識では、STLはVC++そのものということになっている。
0654デフォルトの名無しさんNGNG
ずいぶんいい加減なライブラリだな
0655618NGNG
>>630 >>631 さん
いちおう、目的は「Bに対する諸々の処理を一箇所にする」なのであとは
どっちが良いか色々ためしてみます。ありがとう。
0656マイク ◆yrBrqfF1Ew NGNG
そういやstd::strstrの第一引数の文字列が'\0'で終わってなかったら
どうなるんだろうな?
0657デフォルトの名無しさんNGNG
>>636
使ってるコンパイラで↓のプログラムの実行結果を確認してください。
ちなみに 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デフォルトの名無しさんNGNG
どうでもいいが、 cygming special じゃない?
0659657NGNG
>>658
お?そういえば前はそうだったような気がします。
でもこれは g++ --version からコピペしてます。
こないだ入った更新をインストールしたから、それで変わったのかもしれません。
0660デフォルトの名無しさんNGNG
>>657様

自分の環境でためしたところ、not foundになりました。

findでは空白文字を含む文字列の検索は正しくできるけど、
find_last_ofは、空白文字を含む文字列の検索は正しくされないのでしょうか?

0661デフォルトの名無しさんNGNG
>>660
なんで>>636の時点で find_last_of() と書かなかった?
find_last_of() の仕様知ってるのか?
欲しいのは rfind() じゃないか?
0662デフォルトの名無しさんNGNG
これ、年金の財源にしようぜ
0663662NGNG
みすだす。。。すまそ・・・
0664デフォルトの名無しさんNGNG
>>660
救えねぇやつ。
なんか ttp://www8.ocn.ne.jp/~tsugaru3/shakkinn1.htm これを思い出しちまったよ。
0665デフォルトの名無しさんNGNG
template <class T>
inline T* Create()
{
 return new T;
}
こんな感じの関数を見たんですけどこれはどうやって呼び出すんですか?
0666デフォルトの名無しさんNGNG
int * hoge = Create<int>();
0667デフォルトの名無しさんNGNG
>>666
ほーなるほどありがとう
0668デフォルトの名無しさんNGNG
>>666
int *じゃなくてT *でしょ?
0669デフォルトの名無しさんNGNG
>>668
なにいってんの?
0670デフォルトの名無しさんNGNG
夏なんていらない
0671デフォルトの名無しさんNGNG
最近暑かったしね
0672デフォルトの名無しさんNGNG
熱雑音が強いな
0673デフォルトの名無しさんNGNG
>>661
神様、ありがとうございますぅ^_~
0674デフォルトの名無しさんNGNG
virturalを指定しない(メンバ)関数って(派生クラスのメンバ関数で)オーバーライドできないの?
テストコードを実装できるスキルがまだないので教えてください。
0675デフォルトの名無しさんNGNG
>>674
スキルがないんだったら今知らなくてもいいこと
答えは出来ません
非仮想関数の再定義が起こるようなら設計を見直すべき
0676デフォルトの名無しさんNGNG
>>675
ありがとうございます。
不安なら現時点ではvirtual指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
■ このスレッドは過去ログ倉庫に格納されています