C++相談室 part54
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2006/10/30(月) 22:34:08ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0175デフォルトの名無しさん
2006/11/04(土) 01:04:530176デフォルトの名無しさん
2006/11/04(土) 01:08:41あーそういうことか。
でかいテンプレートコンポーネントの前方宣言は <iosfwd> みたいに
実装者が提供しないといけないってことになるかな。
覚えておこう。
0177デフォルトの名無しさん
2006/11/04(土) 01:11:270178デフォルトの名無しさん
2006/11/04(土) 01:18:340179デフォルトの名無しさん
2006/11/04(土) 01:19:24×定義ヘッダ
○定義
×仮引数
○デフォルト引数
×テンプレートクラス
○クラステンプレート
△先行宣言
○前方宣言
たて続けに気になったんで、な。
0180デフォルトの名無しさん
2006/11/04(土) 01:20:33使い方の解説ならあるんだろうけど、作り方はないだろうなぁ。
ソース読めば。
0181デフォルトの名無しさん
2006/11/04(土) 02:25:11前方宣言のほうが先行宣言より正しいような気はする。
0182デフォルトの名無しさん
2006/11/04(土) 03:23:05free(*ptr); なのか
free(ptr); なのかどっちですか?
0183デフォルトの名無しさん
2006/11/04(土) 03:24:46free(*ptr) じゃコンパイル通らんだろ。 free(ptr) だな。
0184デフォルトの名無しさん
2006/11/04(土) 13:06:30ここのptrはint **なんでしょうか
0185デフォルトの名無しさん
2006/11/04(土) 13:18:47誤記だろう。
ptr は int* のはず。
0186デフォルトの名無しさん
2006/11/04(土) 13:40:280187デフォルトの名無しさん
2006/11/04(土) 14:20:540188デフォルトの名無しさん
2006/11/04(土) 14:54:02もういいよ
現場で使う言語がC++なんだから・・・
0189デフォルトの名無しさん
2006/11/04(土) 15:14:220190デフォルトの名無しさん
2006/11/04(土) 15:36:220191デフォルトの名無しさん
2006/11/04(土) 15:50:19起床時間:
就寝時間:
食事:
行動:
など
0192デフォルトの名無しさん
2006/11/04(土) 15:56:17仕様なら仕様らしく書いてください
そんなのじゃ仕事できまんせ
0193デフォルトの名無しさん
2006/11/04(土) 16:06:14正直に聞くが其れをゲットしてうれしいか?
0194デフォルトの名無しさん
2006/11/04(土) 16:35:01さーて今起きたことだし、コンビニで弁当かってC++FAQでも読みながらたべよ
0195デフォルトの名無しさん
2006/11/04(土) 16:55:150196デフォルトの名無しさん
2006/11/04(土) 18:33:490197デフォルトの名無しさん
2006/11/04(土) 19:15:200198デフォルトの名無しさん
2006/11/04(土) 19:22:04頭のテカりも良くなってきているから凶から茄子をやろう。うへへ。
0199デフォルトの名無しさん
2006/11/04(土) 19:23:00ちょっ!、意味もなく笑っちまったぢゃないか!
0200デフォルトの名無しさん
2006/11/04(土) 21:06:58News 2006-11-04: The C++ Standard Library Issues List (Revision 45) is available
0201デフォルトの名無しさん
2006/11/04(土) 22:48:26いやJavaには推奨される命名規則あるだろ。
C++には無いからどんなの?と聞いただけで。
0202デフォルトの名無しさん
2006/11/04(土) 22:49:40無いんだよ。わかってるじゃないか。
0203デフォルトの名無しさん
2006/11/04(土) 23:11:45言語仕様を覚えようと必死な俺だが、
C++は道具であって目的じゃない。と
0204デフォルトの名無しさん
2006/11/04(土) 23:44:13C++の言語仕様を完全に把握しようというのは、とても難しいよね。
自分がやりたいことを実現するために必要な範囲を覚えたら、道具としては十分使える。
それで足りなくなったらまた覚えればいい。
知識が足りないうちは、大丈夫だと分かっていることだけを使おうとしても
知らずにまずい書き方をすることもあるだろうけど、
ある程度のレベルに達すれば、自分が大丈夫だと分かる範囲の機能だけを
正しく使えるようになると思う。
0205デフォルトの名無しさん
2006/11/04(土) 23:51:15boostをまねておけばいい
STLの実装はまねちゃ駄目だぞ
0206デフォルトの名無しさん
2006/11/05(日) 02:36:48>>123にあるような、数年前以前はどうなってたの?
0207デフォルトの名無しさん
2006/11/05(日) 03:05:20数年前も十年前も今でも、 C++ で推奨される命名規則など無い。
そして標準ライブラリの命名規則はずっとある。
何か不満か?
0208デフォルトの名無しさん
2006/11/05(日) 03:10:16>>128のC/C++風がほとんどだったと思う
0209デフォルトの名無しさん
2006/11/05(日) 03:11:56C++ Coding Standards: 0項の一部を勝手に要約。
「一貫性のある規約を自分で定義し管理せよ」
まあ世の流行ってのはあるが、関連がないなら合わせる意味はない。
0210デフォルトの名無しさん
2006/11/05(日) 03:14:34>>209の言うとおり馴れたのがあればそれが一番適当だと思うな
0211デフォルトの名無しさん
2006/11/05(日) 10:48:490212デフォルトの名無しさん
2006/11/05(日) 10:50:58書く上ではShiftキーを押すのがどうも「踏み切り前の一時停止」みたいで野暮ったいw
だからアンダーバーもちょっと抵抗あって、hoge-fugaみたいに書けるLispのやり方が好き。
でもそれは、読む際の事情はまた別なんだよな。
0213デフォルトの名無しさん
2006/11/05(日) 11:01:42つまり、ほんの僅かな手間を惜しんで事故の可能性を増大させるわけですな。
0214デフォルトの名無しさん
2006/11/05(日) 12:24:37君、ちょっと読めなさすぎ。
0215デフォルトの名無しさん
2006/11/05(日) 12:47:12class 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:170217デフォルトの名無しさん
2006/11/05(日) 12:58:06コンパイル時にクラスhogeのメンバ関数hoge_funcは解決されるから呼び出せる、ってだけじゃね?
0218デフォルトの名無しさん
2006/11/05(日) 13:15:47ただ同じことを繰り返してるだけなので、
試行が終わるたびにテキストで出力すればあとは手作業で済ませます。
どうすれば、試行の度に出力することができますか?
ファイル名をその度に変える必要があるんどえしょうか?
0219デフォルトの名無しさん
2006/11/05(日) 13:19:47hogeの定義次第じゃね?
>>218
スレ違い。
アップローダにソースを載せて、初心者スレ辺りで質問しなおせば誰かヒントをくれるかもしれない。
0220デフォルトの名無しさん
2006/11/05(日) 13:21:04ありがとうございます
0221デフォルトの名無しさん
2006/11/05(日) 13:35:31そういうものなんでしょうか。コンパイル時の解決関係で調べてみます。
>>219
hogeはCDialogの継承クラスなんですが、そういうのも関係してるのかなあとか。。
自分が作ったんじゃないんですが、たぶんダイアログをリソースエディタで作ったときに
当時VC6.0でクラスの追加メニューで作ったんだと思います。。
0222デフォルトの名無しさん
2006/11/05(日) 13:40:33それは非仮想メンバ関数が第一引数の前にthisポインタを渡す関数として実装されることが多いからで(ry
0223デフォルトの名無しさん
2006/11/05(日) 13:58:56す、すいません、よく理解できませんでした。。
第一引数の前にthisポインタを渡す関数
というのは、第一引数を渡す前に、thisポインタを渡すので暗黙のうちに場所がわかるということでしょうか?
それはメンバ関数内で別の自分と同じクラスのメンバ関数呼ぶときに、実体を指定せずに関数名だけで呼べるみたいな
ことでしょうか?
しかし今回hogeの実体は一度も作られていないので、thisポインタすら無いように思います
fooのほうは、実体はあるのですが。。
なんか間違ってるかもしれません
0224デフォルトの名無しさん
2006/11/05(日) 14:06:21A->hoge_func()がhoge_func(A)に変わるとしたら
thisに0入ってるんじゃねーの?
0225デフォルトの名無しさん
2006/11/05(日) 14:13:49今手元にソースがないので来週試してデバッグしてみます。。
0226デフォルトの名無しさん
2006/11/05(日) 14:14:18未定義動作。修正必須。
0227デフォルトの名無しさん
2006/11/05(日) 14:23:53とりあえずロジックとしてはおかしい?とおもうのでとにかく直しておきます。
ありがとうございます。
0228デフォルトの名無しさん
2006/11/06(月) 08:29:45deleteじゃダメですか?
0229デフォルトの名無しさん
2006/11/06(月) 08:42:370230デフォルトの名無しさん
2006/11/06(月) 14:54:23deleteはnewされたオブジェクトに対してのみ。
strdup()は内部的にmalloc()を呼び出しているので、free()を使う。
0231デフォルトの名無しさん
2006/11/06(月) 15:54:540232デフォルトの名無しさん
2006/11/06(月) 16:13:57for_each()って事?
添え字がわかっているならoperator[]でアクセスできるけど
0233デフォルトの名無しさん
2006/11/06(月) 16:17:03lower_bound()も使える。
0234デフォルトの名無しさん
2006/11/06(月) 16:41:44template< 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出力したいのですがそのようなプログラムになるのでしょうか?よろしくお願いします。
0236デフォルトの名無しさん
2006/11/06(月) 16:47:56質問が抽象的すぎ
ある値がどこにあるのかとか。
それ以前に丸投げってやつは(ry
0237デフォルトの名無しさん
2006/11/06(月) 16:53:08たとえばある一次式のxの値に1.2.5.10.20.50.100.200・・・・と順にその答えを出したいのですが、
1.2.5.10.20.50.100.200・・・・をどうやって出力するのかってことかな?
0238デフォルトの名無しさん
2006/11/06(月) 16:54:250239デフォルトの名無しさん
2006/11/06(月) 17:06:330240デフォルトの名無しさん
2006/11/06(月) 17:10:390241デフォルトの名無しさん
2006/11/06(月) 17:13:030242デフォルトの名無しさん
2006/11/06(月) 17:15:240243デフォルトの名無しさん
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{
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きちんとした実験結果があるのになぜ質問しているのか不明ですが、
現に変わってるでしょう?
なぜこういう動作になるかは、コピーコンストラクタがある場合と無い場合とで
引数(と戻り値)の受け渡しがどう変わるかを調べればわかると思います。
0246デフォルトの名無しさん
2006/11/06(月) 19:00:08printf("%d.%d.%d.", x[0]*=10, x[1]*=10,x[2]*=10);
}
のほうがよくね?
0247デフォルトの名無しさん
2006/11/06(月) 19:48:05コンパイラはコピーを最適化して除去できるので
変わっても不思議ではない。実際、GCCではどちらも2回だった
0248デフォルトの名無しさん
2006/11/06(月) 21:10:23"Move Semantics"
という単語がでてくるんですが、コレは
std::auto_ptrの様にオブジェクトの所有権が移動する
事を指している
という認識でいいんですか?
0249デフォルトの名無しさん
2006/11/06(月) 21:13:57文脈にもよるけど、たぶんC++0xの機能のこと。
その機能の目的はauto_ptrのような所有権の移動を楽に記述するような機能と思えば大体OK
0250デフォルトの名無しさん
2006/11/06(月) 21:25:54ありがとうございます。
具体的にどういう仕組みかわからないので、ググってきます
0251デフォルトの名無しさん
2006/11/06(月) 22:32:39それ、コンパイラ何使ってる?
コピーコンストラクタをユーザー定義するかどうかで
一時オブジェクトの有無が変わる理由がわからん。
0252244
2006/11/07(火) 01:04:15変わってるんですが、なぜかわからなかったもので。
引数と戻り値の受け渡し時のコピーがらみかなとも思ったんですが
調べてもわからなかったもんで。
デストラクタが3回呼ばれるのが謎で
コピーコンストラクタの呼び出しをチェックしようとしたら
デストラクタが2回しか呼ばれなくなってわからなくなりました…
>>247
GCCではどちらも2回なんですね。コンパイラ依存?
VS2005 C++を使ってるんですが、デバッグ用なので
最適化オプションは無効になってますが、
その最適化とは違うことだとすると
ユーザ定義のコピーコンストラクタがない場合のみ
一時オブジェクトが2個作られてるって事でしょうか。調べてみます。
>>251
VS2005 C++です。
私もその理由がわからなくて悩んでます。
>>247 の最適化による除去が濃厚そうですね。
0253デフォルトの名無しさん
2006/11/07(火) 01:23:19B = a | bc
みたなBNFをtemplate使って書いてみたいんですけどどうやって書けばいいの?
0254デフォルトの名無しさん
2006/11/07(火) 01:45:090255デフォルトの名無しさん
2006/11/07(火) 02:04:10つ[Boost.Spirit]
0256デフォルトの名無しさん
2006/11/07(火) 02:04:34ユーザー定義のデストラクタはあり、
ユーザー定義のコピーコンストラクタはない
バランスが取れてないのでVC++は除去しないと見た
ベンダに聞かないと分からんけどなw
0257デフォルトの名無しさん
2006/11/07(火) 02:18:36っていうコンテナ作りました。
これだと、Aを丸々コピーしなくても問題ないですよね?
あと格納したオブジェクトをoperator()を実装して呼び出せば
関数呼び出しのコストはかからないですよね?
0258デフォルトの名無しさん
2006/11/07(火) 02:29:13sizeof(A *)のコピーしか無いだろうが、ポインタの参照先については責任を持たなきゃならんな。
>あと格納したオブジェクトをoperator()を実装して呼び出せば
A::operator () () であろうが、void A::func()であろうが、所詮は同じ「関数」。
0259デフォルトの名無しさん
2006/11/07(火) 10:02:19ttp://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:34News 2006-11-06: C++ Standard Core Language Issues List (Revision 44) is available
0261244
2006/11/07(火) 15:23:23ユーザ定義コピーコンストラクタありだと
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:460263262
2006/11/07(火) 16:09:180264デフォルトの名無しさん
2006/11/07(火) 16:13:26template< 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:52templateをなんだと思ってるんだ?
最近template関係の質問多くなったな
それもアホみたいなのが。
流行ってんの?
0266264
2006/11/07(火) 17:04:54関数の返す方を動的に変えたい
boost::any detAnyFromIndex(int index)
だと、データを取り出すときに結局
boost::any_cast<float>(output )
が必要になって処理が後回しにされるだけで解決にならない
0267デフォルトの名無しさん
2006/11/07(火) 17:14:170268デフォルトの名無しさん
2006/11/07(火) 17:32:39型は静的なものだから、動的に取得することは出来ません。
0269デフォルトの名無しさん
2006/11/07(火) 17:39:080270デフォルトの名無しさん
2006/11/07(火) 17:55:020271デフォルトの名無しさん
2006/11/07(火) 17:55:20その自身たっぷりんりんの発言はどこから来るんだ?
さっさとしね
0272デフォルトの名無しさん
2006/11/07(火) 18:00:22やりたいことを明確に汁
0273デフォルトの名無しさん
2006/11/07(火) 18:06:21できません。
■ このスレッドは過去ログ倉庫に格納されています