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

C++相談室 part54

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v2006/10/30(月) 22:34:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0175デフォルトの名無しさん2006/11/04(土) 01:04:53
>>173 sprit? 作る?
0176デフォルトの名無しさん2006/11/04(土) 01:08:41
>>174
あーそういうことか。
でかいテンプレートコンポーネントの前方宣言は <iosfwd> みたいに
実装者が提供しないといけないってことになるかな。
覚えておこう。
0177デフォルトの名無しさん2006/11/04(土) 01:11:27
boost::spiritだぉごめんお
0178デフォルトの名無しさん2006/11/04(土) 01:18:34
そうだなぁ、まず禿げてみたらどうだい?
0179デフォルトの名無しさん2006/11/04(土) 01:19:24
>>174
×定義ヘッダ
○定義

×仮引数
○デフォルト引数

×テンプレートクラス
○クラステンプレート

△先行宣言
○前方宣言

たて続けに気になったんで、な。
0180デフォルトの名無しさん2006/11/04(土) 01:20:33
>>173
使い方の解説ならあるんだろうけど、作り方はないだろうなぁ。
ソース読めば。
0181デフォルトの名無しさん2006/11/04(土) 02:25:11
forward declaration の訳語って、公式なものは無いの?
前方宣言のほうが先行宣言より正しいような気はする。
0182デフォルトの名無しさん2006/11/04(土) 03:23:05
http://www.bohyoh.com/CandCPP/FAQ/FAQ00057.html
free(*ptr); なのか
free(ptr); なのかどっちですか?
0183デフォルトの名無しさん2006/11/04(土) 03:24:46
>>182
free(*ptr) じゃコンパイル通らんだろ。 free(ptr) だな。
0184デフォルトの名無しさん2006/11/04(土) 13:06:30
じゃあ何故 free(*ptr) と書かれてるんですか?
ここのptrはint **なんでしょうか
0185デフォルトの名無しさん2006/11/04(土) 13:18:47
>>184
誤記だろう。
ptr は int* のはず。
0186デフォルトの名無しさん2006/11/04(土) 13:40:28
ptrはvoid************:だぉwwwwwwwwwwwwwwwwwwww
0187デフォルトの名無しさん2006/11/04(土) 14:20:54
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
0188デフォルトの名無しさん2006/11/04(土) 14:54:02
>>187
もういいよ

現場で使う言語がC++なんだから・・・
0189デフォルトの名無しさん2006/11/04(土) 15:14:22
オブジェクト指向なんて意味ないからね
0190デフォルトの名無しさん2006/11/04(土) 15:36:22
>>190げt
0191デフォルトの名無しさん2006/11/04(土) 15:50:19
C/C++プログラマの休日の過ごし方について教えてください。

起床時間:
就寝時間:
食事:
行動:
など
0192デフォルトの名無しさん2006/11/04(土) 15:56:17
>>191
仕様なら仕様らしく書いてください
そんなのじゃ仕事できまんせ
0193デフォルトの名無しさん2006/11/04(土) 16:06:14
>>190
正直に聞くが其れをゲットしてうれしいか?
0194デフォルトの名無しさん2006/11/04(土) 16:35:01
>>191
さーて今起きたことだし、コンビニで弁当かってC++FAQでも読みながらたべよ
0195デフォルトの名無しさん2006/11/04(土) 16:55:15
どれ、ドラフト行ってくるか・・・今日も欝だ死のう
0196デフォルトの名無しさん2006/11/04(土) 18:33:49
ふぅ、禿に向かってお祈りしないと
0197デフォルトの名無しさん2006/11/04(土) 19:15:20
今日もSFINAEがコンパイル通らなかったなぁ・・・
0198デフォルトの名無しさん2006/11/04(土) 19:22:04
禿に餌やってきた。茄子が好物のようだ。
頭のテカりも良くなってきているから凶から茄子をやろう。うへへ。
0199デフォルトの名無しさん2006/11/04(土) 19:23:00
>>198
ちょっ!、意味もなく笑っちまったぢゃないか!
0200デフォルトの名無しさん2006/11/04(土) 21:06:58
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-11-04: The C++ Standard Library Issues List (Revision 45) is available
0201デフォルトの名無しさん2006/11/04(土) 22:48:26
>>129
いやJavaには推奨される命名規則あるだろ。
C++には無いからどんなの?と聞いただけで。
0202デフォルトの名無しさん2006/11/04(土) 22:49:40
>>201
無いんだよ。わかってるじゃないか。
0203デフォルトの名無しさん2006/11/04(土) 23:11:45
C++やってて思うんだ
言語仕様を覚えようと必死な俺だが、
C++は道具であって目的じゃない。と
0204デフォルトの名無しさん2006/11/04(土) 23:44:13
>>203
C++の言語仕様を完全に把握しようというのは、とても難しいよね。
自分がやりたいことを実現するために必要な範囲を覚えたら、道具としては十分使える。
それで足りなくなったらまた覚えればいい。

知識が足りないうちは、大丈夫だと分かっていることだけを使おうとしても
知らずにまずい書き方をすることもあるだろうけど、
ある程度のレベルに達すれば、自分が大丈夫だと分かる範囲の機能だけを
正しく使えるようになると思う。
0205デフォルトの名無しさん2006/11/04(土) 23:51:15
>>201
boostをまねておけばいい
STLの実装はまねちゃ駄目だぞ
0206デフォルトの名無しさん2006/11/05(日) 02:36:48
>>202
>>123にあるような、数年前以前はどうなってたの?
0207デフォルトの名無しさん2006/11/05(日) 03:05:20
>>206
数年前も十年前も今でも、 C++ で推奨される命名規則など無い。
そして標準ライブラリの命名規則はずっとある。

何か不満か?
0208デフォルトの名無しさん2006/11/05(日) 03:10:16
>>206
>>128のC/C++風がほとんどだったと思う
0209デフォルトの名無しさん2006/11/05(日) 03:11:56
>>206
C++ Coding Standards: 0項の一部を勝手に要約。
「一貫性のある規約を自分で定義し管理せよ」

まあ世の流行ってのはあるが、関連がないなら合わせる意味はない。
0210デフォルトの名無しさん2006/11/05(日) 03:14:34
というか最早命名規則でどーのと悩む時間すら惜しいわけで…
>>209の言うとおり馴れたのがあればそれが一番適当だと思うな
0211デフォルトの名無しさん2006/11/05(日) 10:48:49
そんなわけで取り合えずJavaのに合わせてる俺がいきなり全裸。
0212デフォルトの名無しさん2006/11/05(日) 10:50:58
書く時の「指先の理想」と、読む時の「目の理想」はまた別なのが奥深い。
書く上ではShiftキーを押すのがどうも「踏み切り前の一時停止」みたいで野暮ったいw
だからアンダーバーもちょっと抵抗あって、hoge-fugaみたいに書けるLispのやり方が好き。
でもそれは、読む際の事情はまた別なんだよな。
0213デフォルトの名無しさん2006/11/05(日) 11:01:42
>>212
つまり、ほんの僅かな手間を惜しんで事故の可能性を増大させるわけですな。
0214デフォルトの名無しさん2006/11/05(日) 12:24:37
>>213
君、ちょっと読めなさすぎ。
0215デフォルトの名無しさん2006/11/05(日) 12:47:12
hogeクラスとfooクラスがあったとして

class foo
{
hoge *A;
void test();
}

void foo::test()
{
// Aの中身は0x00000000のまま
A->hoge_func();
}

でA::hoge_funcのなかではグローバルなりソースか、hoge_func内で宣言した
関数内のローカルなリソースしか使っていなくて、hogeクラスのメンバは一切使ってない
のですが、これってA->hoge_func読んだ時点でnull参照で落ちるんですよね???

VC2005でコンパイルしたんですが、これでずっと動いてたのですが、
デバッグで動かしてもちゃんとA::hoge_funcのなかに飛ぶので、不思議なのです。。
これは実は落ちないものなんでしょうか?
0216デフォルトの名無しさん2006/11/05(日) 12:48:17
↑AはInitInstanceでNULLに初期化されていました
0217デフォルトの名無しさん2006/11/05(日) 12:58:06
>>215
コンパイル時にクラスhogeのメンバ関数hoge_funcは解決されるから呼び出せる、ってだけじゃね?
0218デフォルトの名無しさん2006/11/05(日) 13:15:47
メモリが足りなくて困ってます。
ただ同じことを繰り返してるだけなので、
試行が終わるたびにテキストで出力すればあとは手作業で済ませます。
どうすれば、試行の度に出力することができますか?
ファイル名をその度に変える必要があるんどえしょうか?
0219デフォルトの名無しさん2006/11/05(日) 13:19:47
>>215
hogeの定義次第じゃね?

>>218
スレ違い。
アップローダにソースを載せて、初心者スレ辺りで質問しなおせば誰かヒントをくれるかもしれない。
0220デフォルトの名無しさん2006/11/05(日) 13:21:04
>>219
ありがとうございます
0221デフォルトの名無しさん2006/11/05(日) 13:35:31
>>217
そういうものなんでしょうか。コンパイル時の解決関係で調べてみます。

>>219
hogeはCDialogの継承クラスなんですが、そういうのも関係してるのかなあとか。。
自分が作ったんじゃないんですが、たぶんダイアログをリソースエディタで作ったときに
当時VC6.0でクラスの追加メニューで作ったんだと思います。。
0222デフォルトの名無しさん2006/11/05(日) 13:40:33
>>221
それは非仮想メンバ関数が第一引数の前にthisポインタを渡す関数として実装されることが多いからで(ry
0223デフォルトの名無しさん2006/11/05(日) 13:58:56
>>222
す、すいません、よく理解できませんでした。。
第一引数の前にthisポインタを渡す関数
というのは、第一引数を渡す前に、thisポインタを渡すので暗黙のうちに場所がわかるということでしょうか?
それはメンバ関数内で別の自分と同じクラスのメンバ関数呼ぶときに、実体を指定せずに関数名だけで呼べるみたいな
ことでしょうか?
しかし今回hogeの実体は一度も作られていないので、thisポインタすら無いように思います
fooのほうは、実体はあるのですが。。
なんか間違ってるかもしれません
0224デフォルトの名無しさん2006/11/05(日) 14:06:21
>>223
A->hoge_func()がhoge_func(A)に変わるとしたら
thisに0入ってるんじゃねーの?
0225デフォルトの名無しさん2006/11/05(日) 14:13:49
ますます意味がわからなくなってきました。勉強不足でスイマセン。
今手元にソースがないので来週試してデバッグしてみます。。
0226デフォルトの名無しさん2006/11/05(日) 14:14:18
>>215
未定義動作。修正必須。
0227デフォルトの名無しさん2006/11/05(日) 14:23:53
未定義だけど、コンパイラのおかげ??で偶然動いてるんですね。。
とりあえずロジックとしてはおかしい?とおもうのでとにかく直しておきます。
ありがとうございます。
0228デフォルトの名無しさん2006/11/06(月) 08:29:45
strdupってcでもc++でもfreeしなきゃダメなんですか?
deleteじゃダメですか?
0229デフォルトの名無しさん2006/11/06(月) 08:42:37
使っているCランタイムライブラリのドキュメントを読め
0230デフォルトの名無しさん2006/11/06(月) 14:54:23
>>228
deleteはnewされたオブジェクトに対してのみ。
strdup()は内部的にmalloc()を呼び出しているので、free()を使う。
0231デフォルトの名無しさん2006/11/06(月) 15:54:54
vectorに多数のクラスを格納した場合、クラスの中のメンバ変数を検索する場合どうしたらよいのでしょうか?
0232デフォルトの名無しさん2006/11/06(月) 16:13:57
>>231
for_each()って事?
添え字がわかっているならoperator[]でアクセスできるけど
0233デフォルトの名無しさん2006/11/06(月) 16:17:03
関係ないけどメンバ変数が降順もしくは昇順にソートされているなら
lower_bound()も使える。
0234デフォルトの名無しさん2006/11/06(月) 16:41:44
>>231

template< class T, typename V > struct my_predicate
: public binary_function< T, V, bool > {
 bool operator()( T const & t, V v ) const {
  /* TODO:比較処理 */
 }
};

...

vector<T> vt;
vector<T>::iterator it = find_if( vt.begin(), vt.end(), bind2nd(my_predicate<T,int>(),1) );
0235デフォルトの名無しさん2006/11/06(月) 16:45:27
ある値を使いたいのですが、その値を1.2.5.10.20.50.100.200・・・・のように
出力したいのですがそのようなプログラムになるのでしょうか?よろしくお願いします。
0236デフォルトの名無しさん2006/11/06(月) 16:47:56
>>235
質問が抽象的すぎ
ある値がどこにあるのかとか。
それ以前に丸投げってやつは(ry
0237デフォルトの名無しさん2006/11/06(月) 16:53:08
>>235-236
たとえばある一次式のxの値に1.2.5.10.20.50.100.200・・・・と順にその答えを出したいのですが、
1.2.5.10.20.50.100.200・・・・をどうやって出力するのかってことかな?
0238デフォルトの名無しさん2006/11/06(月) 16:54:25
単に、数字をピリオドで区切っていくつも出力したいだけなのでは・・・
0239デフォルトの名無しさん2006/11/06(月) 17:06:33
順番に出力だとちょっと面倒だなぁ
0240デフォルトの名無しさん2006/11/06(月) 17:10:39
単に{1,2,5}の配列に*10しつづけながら出力するだけじゃないの?
0241デフォルトの名無しさん2006/11/06(月) 17:13:03
考え方はそれで良いと思うけど、プログラムにするとちょい面倒・・・
0242デフォルトの名無しさん2006/11/06(月) 17:15:24
それのどこが面倒なのか
0243デフォルトの名無しさん2006/11/06(月) 17:25:51
よくわからないけどこういうこと?

#include <stdio.h>

void main(void){
int x[] = {1, 2, 5};
int i;

for(i = 1; 1; i *= 10)
printf("%d.%d.%d.", x[0]*i, x[1]*i, x[2]*i);
}
0244デフォルトの名無しさん2006/11/06(月) 18:43:29
struct c
{
c(){cout << "c ctor" << endl ;}
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){cout << "c dtor" << endl ;}
} ;

c func( c obj )
{
cout << "func" << endl ;
return (obj) ;
}
で
func( c() ) ;
と実行すると
c ctor
func
c dtor
c dtor
c dtor

//をとってコピーコンストラクタを実装すると
c ctor
func
c copy ctor
c dtor
c dtor

コピーコンストラクタの定義の有無で
デストラクタの呼び出し回数が変わるものなのでしょうか?
0245デフォルトの名無しさん2006/11/06(月) 18:53:08
>>244
きちんとした実験結果があるのになぜ質問しているのか不明ですが、
現に変わってるでしょう?

なぜこういう動作になるかは、コピーコンストラクタがある場合と無い場合とで
引数(と戻り値)の受け渡しがどう変わるかを調べればわかると思います。
0246デフォルトの名無しさん2006/11/06(月) 19:00:08
for(;;) {
printf("%d.%d.%d.", x[0]*=10, x[1]*=10,x[2]*=10);
}
のほうがよくね?
0247デフォルトの名無しさん2006/11/06(月) 19:48:05
>>244
コンパイラはコピーを最適化して除去できるので
変わっても不思議ではない。実際、GCCではどちらも2回だった
0248デフォルトの名無しさん2006/11/06(月) 21:10:23
C++関係のサイトをみていると
"Move Semantics"
という単語がでてくるんですが、コレは
std::auto_ptrの様にオブジェクトの所有権が移動する
事を指している
という認識でいいんですか?
0249デフォルトの名無しさん2006/11/06(月) 21:13:57
>>248
文脈にもよるけど、たぶんC++0xの機能のこと。
その機能の目的はauto_ptrのような所有権の移動を楽に記述するような機能と思えば大体OK
0250デフォルトの名無しさん2006/11/06(月) 21:25:54
>>249
ありがとうございます。
具体的にどういう仕組みかわからないので、ググってきます
0251デフォルトの名無しさん2006/11/06(月) 22:32:39
>>244
それ、コンパイラ何使ってる?
コピーコンストラクタをユーザー定義するかどうかで
一時オブジェクトの有無が変わる理由がわからん。
02522442006/11/07(火) 01:04:15
>>245
変わってるんですが、なぜかわからなかったもので。
引数と戻り値の受け渡し時のコピーがらみかなとも思ったんですが
調べてもわからなかったもんで。

デストラクタが3回呼ばれるのが謎で
コピーコンストラクタの呼び出しをチェックしようとしたら
デストラクタが2回しか呼ばれなくなってわからなくなりました…

>>247
 GCCではどちらも2回なんですね。コンパイラ依存?

 VS2005 C++を使ってるんですが、デバッグ用なので
 最適化オプションは無効になってますが、
 その最適化とは違うことだとすると
 ユーザ定義のコピーコンストラクタがない場合のみ
 一時オブジェクトが2個作られてるって事でしょうか。調べてみます。

>>251
 VS2005 C++です。
 私もその理由がわからなくて悩んでます。
 >>247 の最適化による除去が濃厚そうですね。
0253デフォルトの名無しさん2006/11/07(火) 01:23:19
A := B | C | D
B = a | bc

みたなBNFをtemplate使って書いてみたいんですけどどうやって書けばいいの?
0254デフォルトの名無しさん2006/11/07(火) 01:45:09
一体全体どこにtemplateを使うって?
0255デフォルトの名無しさん2006/11/07(火) 02:04:10
>>253
つ[Boost.Spirit]
0256デフォルトの名無しさん2006/11/07(火) 02:04:34
>>251
ユーザー定義のデストラクタはあり、
ユーザー定義のコピーコンストラクタはない
バランスが取れてないのでVC++は除去しないと見た
ベンダに聞かないと分からんけどなw
0257デフォルトの名無しさん2006/11/07(火) 02:18:36
std::map<std::string, A *> m;
っていうコンテナ作りました。

これだと、Aを丸々コピーしなくても問題ないですよね?

あと格納したオブジェクトをoperator()を実装して呼び出せば
関数呼び出しのコストはかからないですよね?
0258デフォルトの名無しさん2006/11/07(火) 02:29:13
>>257
sizeof(A *)のコピーしか無いだろうが、ポインタの参照先については責任を持たなきゃならんな。


>あと格納したオブジェクトをoperator()を実装して呼び出せば
A::operator () () であろうが、void A::func()であろうが、所詮は同じ「関数」。
0259デフォルトの名無しさん2006/11/07(火) 10:02:19
>>253
ttp://p-stade.sourceforge.net/biscuit/index.html

typedef seq<
 chseq<'/','*'>,
 star_until< any, chseq<'*','/'> >
> c_comment;

std::string text("/* Hello, Biscuit! */");
if (biscuit::match<c_comment>(text)) {
 //...
}
0260デフォルトの名無しさん2006/11/07(火) 10:29:34
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-11-06: C++ Standard Core Language Issues List (Revision 44) is available
02612442006/11/07(火) 15:23:23
下記のコードでfunc2()の引数objが初期化される時に
ユーザ定義コピーコンストラクタありだと
 c obj = c() ;
ユーザ定義コピーコンストラクタなしだと
 c tmp = c() ; c obj = c ;
となるみたいです。

DEBUG版だから最適化無効になっているはずなんですけどね。
コンパイラの最適化の話ではなく、C++の言語仕様なんだろうか。
--
struct c
{
c(){ cout << "c ctor" << endl ; }
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){ cout << "c dtor" << endl ;}
} ;

void func2( c obj ) {cout << "func2" << endl ; }

で、以下をユーザ定義コピーコンストラクタあり/なしで実行すると、
func2( c() ) ;

ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor

ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor
c dtor
0262デフォルトの名無しさん2006/11/07(火) 16:08:46
実行結果をノートパッドなどに出力する方法教えてください・・・
02632622006/11/07(火) 16:09:18
スレ違いでしたすいません
0264デフォルトの名無しさん2006/11/07(火) 16:13:26
動的な型決定みたいなことをしたいのですが、どこかに適当なサンプルコードなどないでしょうか

template< Any>//??
Any detAnyFromIndex(int index)
{
if(index==0)
return( (char)(... ) )
if(index==1)
return( (int)(... ) )
if(index==2)
return( (double)(... ) )
}
0265デフォルトの名無しさん2006/11/07(火) 16:45:52
>>264
templateをなんだと思ってるんだ?

最近template関係の質問多くなったな
それもアホみたいなのが。
流行ってんの?
02662642006/11/07(火) 17:04:54
templateでなくてもいいのだけど
関数の返す方を動的に変えたい
boost::any detAnyFromIndex(int index)
だと、データを取り出すときに結局
boost::any_cast<float>(output )
が必要になって処理が後回しにされるだけで解決にならない
0267デフォルトの名無しさん2006/11/07(火) 17:14:17
無理
0268デフォルトの名無しさん2006/11/07(火) 17:32:39
>>266
型は静的なものだから、動的に取得することは出来ません。
0269デフォルトの名無しさん2006/11/07(火) 17:39:08
できるもん!
0270デフォルトの名無しさん2006/11/07(火) 17:55:02
ドラえもん!
0271デフォルトの名無しさん2006/11/07(火) 17:55:20
>>266
その自身たっぷりんりんの発言はどこから来るんだ?
さっさとしね
0272デフォルトの名無しさん2006/11/07(火) 18:00:22
>>266
やりたいことを明確に汁
0273デフォルトの名無しさん2006/11/07(火) 18:06:21
>>264>>266
できません。
02742642006/11/07(火) 18:06:45
>>271
なぜに自身たっぷり?
よくわからないけど、プリプロセッサでなんとかできないか試してみる
■ このスレッドは過去ログ倉庫に格納されています