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

C++相談室 part34

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0548デフォルトの名無しさんNGNG
minじゃね?
0549デフォルトの名無しさんNGNG
>>533,>>546 頭悪そう。
0550デフォルトの名無しさんNGNG
>>547
勝手に後ろを切り捨てちゃまずいだろ。

char hairetu[256];
if(str.length() >= sizeof(hairetu)) throw std::range_error("長すぎ");
strcpy(hairetu, str.c_str());
0551マイク ◆yrBrqfF1Ew NGNG
2chネラほどじゃないさ。
0552デフォルトの名無しさんNGNG
インクルードの次の行に
gap::sweet texture;
という記述があるのですが、
これはどういう構文なのでしょうか?
初心者で申し訳ない。
0553デフォルトの名無しさんNGNG
>>552
名前空間(またはクラス型) gap のメンバである sweet 型の変数 texture の定義。
インクルードの次の行であることには意味が無い。
0554デフォルトの名無しさんNGNG
グローバル変数ですよ
0555マイク ◆yrBrqfF1Ew NGNG
//header
namespace gap {
typedef void sweet();
}


//sourcefile
gap::sweet texture; //declare

//omit

gap::sweet texture //def
{
std::cerr<<"\0m0th3rfuck3r"<<std::flush;
std::teminate();
}
0556522NGNG
つまり、
名前空間 gap のメンバである sweet 型の変数 texture を
グローバル変数に定義しているということで間違いないでしょうか?
0557マイク ◆yrBrqfF1Ew NGNG
失礼。間違い。
0558デフォルトの名無しさんNGNG
>>555,>>557 頭悪・・・そう。
0559522NGNG
ヘッダファイルの中で
namespace gap{
void sweet::print()
}

としておいて、ソースの中で
gap::sweet texure
texture.print()

となっているのですが、これは
sweet型の変数textureがprint()という関数を
呼び出しているということであってますでしょうか?
0560デフォルトの名無しさんNGNG
>>559
いや、それだとコンパイル通らないはず。

ところで、そのプログラム全部ここで解説させるつもりなのか?
0561デフォルトの名無しさんNGNG
>>560
セミコロンくらい見逃してやれよ。
0562マイク ◆yrBrqfF1Ew NGNG
>>558
ん?ならお前は何大卒だ?
0563デフォルトの名無しさんNGNG
>>523
char*に対するfillはmemsetで特殊化している実装が多いです
0564522NGNG
>>560
初心者なんだ。イジめるなよ。
コンパイルは通るとおもう。
>>559に書いた通り。
0565デフォルトの名無しさんNGNG
>>562 大学卒業してないよ。
頭悪そうだと思っていたが、もういいかげん頭悪いんだとわかった。
もう触りません。スレ汚して悪かった。
0566デフォルトの名無しさんNGNG
>>564
名前おかしいよ藁
0567デフォルトの名無しさんNGNG
えっと、C言語を使って現在ゲームをコツコツと作ってるのですが
複雑になるにつれ、クラスに纏めたいと思い、C++に手をだしました。
ただ、CもC++もまだ初心者で、中々苦労しています。
特に困っているのが、何をクラスにして派生クラスは何になるのか、メンバは何を持たせるか
みたいな部分が中々把握できません。
基礎的な書き方のようなものは、本を買ってプログラム組んでみました。
こういったことに慣れるための良い練習法のようなものがあれば教えてください。
0568マイク ◆yrBrqfF1Ew NGNG
>>565
わかればいいさ。
0569アイク ◆uCUYQ8/A2w NGNG
俺もコテハンデビューする
0570デフォルトの名無しさんNGNG
>>568
ワラタ
0571デフォルトの名無しさんNGNG
>>567
包含関係に気を配るとよろしいかも。
あと、Effective C++あたりが定番かな。
0572デフォルトの名無しさんNGNG
>>567
http://www.amazon.co.jp/exec/obidos/ASIN/4881356194/250-1099330-3815450
0573デフォルトの名無しさんNGNG
>>571-572
アドバイスありがとうございます。
本も探してみます
0574アイク ◆uCUYQ8/A2w NGNG
>>573
探してる暇があんなら、さっさとamazonで注文しろや
0575アイク ◆uCUYQ8/A2w NGNG
>>574
お前が買ってこいやヴォケ
0576マイク ◆yrBrqfF1Ew NGNG
ただでさえ馬鹿が多いのにうんざりするのが一人増えたな。
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
はっとりくんって忍者はっとりくんのことじゃないですか?
■ このスレッドは過去ログ倉庫に格納されています