|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||ii''''""" "''''"" """"'ii|||||||||||||||||||||||||||||| ||||||||||||||||||iiii'''''"" .,,,,,,,,,, , """'''ii|||||||||||||||| |||||||||||||||||i'" .,,iillll|||||lllli,,. '''"~~"''''・;;,,.. il||||||||||||||| |||||||||||||||〃 i''" ,,,,,,,,, . |||||||||||||||| ||||||||||||||| ,,ii'".iillliiミi,.ミi, .,ッ'~.,illllllliェ. 'i,, i||||||||||||||||| |||||||||||||||| l|" il|||||||||li `|li ,,iii'" ,i|||||||||||i i, l|||||||||||||||| |||||||||||||||| 'il|l,,.ミl||||||リ.,,ii|l" "l||ミェ, ミi|||||||lリ.,li, i||||||||||||||||| |||||||||||||||| "'''iilllllllリ''"" "'ミiilllllliiリ''"" i|||||||||||||||| ||||||||||||||| .,; il|||||||||||||| |||||||||||||||| .;:,,. .,,. il|||||||||||||| il||||||||||||||i, '".;: il|||||||||||| illl||||||||||||||i, .,,,,,メiiiiiメiiillllilllliiiョュ,,,,.. il|||||||||||| iill|||||||||||||i, "iii,.. ,. ,. .,. .,.,,i||||li;. ,il|||||||||||| 'i||||||||||ii, ''ill||""'iil"iiゞゞヾllll|||l'" .il||||||||||||” "i|||||||||ii,,. "'iii'""""'iiiii'"". ..,,iil|||||||||||”" "i|||||||||||iii,, .,,iiillll||||||||” """""""" '''""""
前スレの991は最低だなw 久しぶりにキレたゎw
誰もスレ立てしないみたいだし取り急ぎ立てた。 テンプレは前スレから単純にコピペしたので修正が必要だったら指摘よろ。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
>>8 話の流れが分からんからなんで切れてるのか不明なんだが
後者は無名変数だから一時変数が省略されるとか起きそうな気がする
14 :
デフォルトの名無しさん :2009/12/17(木) 17:03:45
宣伝あげ
∧ ∧ n: |;;;;| |;;;;| || ヽ ヽ / / || , '  ̄ ̄ '、 ピカーwwwwww(お前らさあ、それこのスレと何か関係あるの?) || / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?) f「| |^ト |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?) |: :: ! } ヽ |-┬-| / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?) ヽ ,イ ヽ uー'´ / ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)
16 :
デフォルトの名無しさん :2009/12/17(木) 21:12:21
自分の作ったプログラムをソース隠蔽してライブラリレベルで公開したい。 (C言語の場合はプロトタイプ書いたヘッダーとlibファイル) C++でクラスを公開しないでこれをするにはどうすればいいですか?
インターフェースとファクトリだけ公開します
VC++2005なんですが、「__FILE__」マクロを使うと ファイルパスが全て小文字に変換された形で取得できます。 大文字のまま取得する方法はないですか?
∧ ∧ n: |;;;;| |;;;;| || ヽ ヽ / /ピカァwwwwピカピカwwwww(VC++2005wwww古www) || , '  ̄ ̄ '、 ピカーwwwwww(お前さあ、それこのスレと何か関係あるの?) || / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?) f「| |^ト |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?) |: :: ! } ヽ |-┬-| / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?) ヽ ,イ ヽ uー'´ / ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)
20 :
デフォルトの名無しさん :2009/12/17(木) 23:30:23
まさかヘッダと実装分けてるよね?
22 :
デフォルトの名無しさん :2009/12/18(金) 01:13:37
>20
インライン展開を狙って分けていないのもあります。
が、それは分ければいい話で、public関数以外は変数も見せないような
COM的なことをしたいのです。
>>17 キーワードをぐぐったら、それっぽい「インターフェースクラス」など
未知の領域があったのでもちょっと調べてみまっす。
>>22 どのくらいC++に詳しい?
とりあえずboostとか少しでも知っている?
24 :
23 :2009/12/18(金) 15:50:37
動的削除子の実装の仕方を分かりやすく教えてください。
デストラクタをテンプレート関数でラップして一意なインターフェイスとしてその関数ポインタを動的に保持、メモリから開放するときにそれを実行?
27 :
デフォルトの名無しさん :2009/12/18(金) 18:00:51
動的削除子ってあれか。 shared_ptrとかで実装されているすごいヤツ という認識しかない。
28 :
デフォルトの名無しさん :2009/12/18(金) 18:24:36
もっと分かりやすく説明できる奴はこのスレには居ないのかー!
ぐぐればいくらでも出てくるだろうがそれでも分からなければお前が無能なだけ
上級者スレに貼ってきてやったぞ 感謝しやがれ
なんでそんな過疎スレに貼ってんだ
int i0 = 1; cout << i0 << ", " << ++i0 << endl; int i1 = 1; cout << i1 << ", " << i1++ << endl; が、 gcc version 4.3.3 では 2, 2 2, 1 VC++ 2008 Express では 2, 2 1, 1 となります。 私の知識では 1, 2 1, 1 となると思っていたので大変予想外な結果です。 なぜでしょうか?
>>32 未定義の動作。
未定義の動作って説明いらないよね?知ってる?
どの部分が未定義なのでしょうか? cout << i0 << ", " << ++i0 << endl; であれば、 cout << i0 で、i0の値(参照ではなく)がofstreamの中に入って(言い方が正しいか分かりませんが)しまうので、 (かつての)i0の値とi0本体とはもう別物である、と思ってしまいました。
(1) coutが評価される (1') i0が評価される (1'') ","が評価される (1''') ++i0が評価される(これは評価に副作用がある) (1'''') endlが評価される (2) operator <<((1), (1')) (3) operator <<((2), (1'')) (4) operator <<((3), (1''')) (5) operator <<((4), (1'''')) = expression (1)から(1'''')の評価順序は未定。
36 :
33 :2009/12/18(金) 19:54:40
>>34 残念ながら
初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html > Q 【評価順序】
> 評価の順序が不定である、というのはどういうことか。
> A
> a = foo() + bar(); のようなコードに対して、 foo と bar のどちらが先に
> 呼ばれるか決まっていない、ということです。
> --------------------------------------------------------------------------------
>
> Q 【優先順序】
> 評価と優先順序とは何が違うのか。
> A
> 優先順序というのは、異なる演算子が式の中で組み合わせられた場合に、
> どの結合を優先的に行うかを決めた規則です。算数で、掛け算は足し算よりも先に計算する
> 、という規則があるのと同じです。
> しかし、優先順序に関らず、それぞれの項の評価順序は不定のままです。
> 例えば、次の式は、どのような順序で関数が 呼ばれるか分かりません。
> これで言えるのは、 f2() を呼び出して得られた値と f3() を呼び出して得られた値を
> まず掛け算し、その結果と f1() を呼び出して得られた値を加算する、
> ということだけです。最後に足し算が行われるにもかかわらず、
> f1() が真っ先に呼び出されて、掛け算が終わるまで
> その値が保存されているかもしれません。
>
> i = f1() + f2() * f3();
37 :
33 :2009/12/18(金) 20:03:33
>>34 > (かつての)i0の値とi0本体とはもう別物である、と思ってしまいました。
それを実現したい場合は
cout << i0 << ", ";
cout << ++i0 << endl;
こうするしかないね。
簡単に言うと
一つの式の中でiの値が変化する->変化する場所はたった1ヵ所のみでなければならず、さらにその変化後のiの値を取得する目的以外でiを参照してはならない。
例 cout << ++i0; はOK
i++*i++; はダメ。
++i*i; もダメ。
一つの式の中でiの値が変化しない->何回参照してもok
例 cout << i0 << i0 << i0;はOK
38 :
32 :2009/12/18(金) 20:38:47
>>33 >>35 >>36 >>37 ありがとうございます。
<<演算子のオーバーロードを、
std::ostream& operator<< ( std::ostream& os, const T& val )
{
return ( os << val );
}
の様に定義するので、左から順にoperator<<関数を呼んでいって
(1) cout << i0;
(2) cout( i0評価済み ) << ", ";
(3) cout( i0 と ", " 評価済み ) << ++i0;
(4) cout( i0 と ", " と ++i0 評価済み) << endl;
を想像していました。
左から順に評価をしないと 第1引数の std::ostream に coutが来ないので
上手く処理できないんではないかと。
>>35 のように、引数全部をまず評価するのですね。
勉強になりました。
39 :
デフォルトの名無しさん :2009/12/18(金) 20:39:29
質問です。 環境はWinXP、VC++2008 Express Editionです。 Windowsフォームアプリケーションを作成しています。 フォームのテキストボックスに入力された文字列(英数字のみ)を取得し、1文字ずつ16進数に変換し、その総和を計算したいのですが良い方法はありますか? 【例】 テキストボックスに"12"と入力されたとき、0x31 + 0x32を計算して0x63とする。 また、3桁の16進数となった時は下2桁のみ取得します。 取得した2桁の16進数は各桁に該当する英数字を文字もしくは文字列で取得(総和が0x63ならば"6"と"3"をそれぞれ取得)します。 文字列をGetBytesで変換後バイト型配列に格納し、 BitConvertで弄るなど考えましたが上手くいきません。 宜しくお願い致します。
40 :
33 :2009/12/18(金) 21:50:49
>>38 > 左から順に評価をしないと 第1引数の std::ostream に coutが来ないので
> 上手く処理できないんではないかと。
評価順
と
優先順序
の違いってやつだな。
> のように、引数全部をまず評価するのですね。
いや、それも別に決まってはいないんだってば。
君の想定した通りにしてもいいし、しなくてもいい。
>>39 ヒント: 文字型(char, wchar_t)はC/C++ではただの桁数の少ないint
43 :
41 :2009/12/18(金) 23:14:00
44 :
41 :2009/12/18(金) 23:29:42
CLIでなくC/C++ではcharは文字以外に何に使った?? (Windowsの例) char = 8ビット 0 〜 255 の整数型
地震怖いお(^ω^;)
46 :
デフォルトの名無しさん :2009/12/19(土) 15:36:18
>>42 ,44
レスありがとうございます。
入力された文字列を1文字ずつ取り出してchar型の変数に格納し、
それらの総和を計算し、最後に16進数に変換するということになるのでしょうか?
wchar_tだろ?? sizeof(wchar_t) = ?? sizeof(short) = ??
48 :
デフォルトの名無しさん :2009/12/19(土) 16:09:40
wchar_t wc1 = L'a'; wchar_t wc2 = L'あ'; unsigned char *data = NULL; // a : 0x61 0x00 data = reinterpret_cast<unsigned char*>(&wc1); printf("a : 0x%02hx 0x%02hx \n", data[0], data[1]); // あ : 0x42 0x30 data = reinterpret_cast<unsigned char*>(&wc2); printf("あ : 0x%02hx 0x%02hx \n", data[0], data[1]);
49 :
デフォルトの名無しさん :2009/12/19(土) 16:12:30
%02hhx じゃないの?
50 :
デフォルトの名無しさん :2009/12/19(土) 16:20:05
51 :
デフォルトの名無しさん :2009/12/19(土) 16:21:34
オーバーフローするので総和はintにしましょう
> wchar_tのサイズってもしかして環境依存??
なんだ!
この低レベルな議論はw
char以外、サイズは決まってないだろ?
だいたい
>>47 の言う通りsizeofを何故使わない?
53 :
デフォルトの名無しさん :2009/12/19(土) 17:32:46
typedef wchar_t mini_int;
おつですな
もしかしてもクソもねぇw 環境依存に決まってんだろ それぐらい知らないようではC/C++やる資格はねぇ。
typedef long long long too_long;
57 :
デフォルトの名無しさん :2009/12/19(土) 19:37:12
58 :
デフォルトの名無しさん :2009/12/19(土) 19:39:39
unsignedばっかだな
>>56 g++でコンパイルしてみたら
error: 'long long long' is too long for GCC
だってさ。ユーモアあるな。
>>59 4つ並べてもメッセージ同じだった。
どうして3つだけなのよォオオオ〜ッ!!
61 :
デフォルトの名無しさん :2009/12/19(土) 20:41:06
typedef short short short too_short; これやってみ。
63 :
デフォルトの名無しさん :2009/12/19(土) 20:54:39
#include <stdio.h> #include <limits.h> #define < = #define あふれとるやんけ ULLONG_MAX + 1 typedef unsigned long long (;一_一); int main() { (;一_一) つ < あふれとるやんけ; return 0; }
64 :
デフォルトの名無しさん :2009/12/19(土) 22:26:52
class MyClass{}; このクラスの定義はするが オブジェクトは作られたくない という場合、どう実現すればよいでしょうか?
コンストラクタをprivateにする
69 :
66 :2009/12/20(日) 13:37:49
>>67-68 > 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
両方必要そうなので、両方やります。
ありがとうございました。
片方でいいよ 継承する気がないなら68だけにしろ 仮想関数入れるとサイズ無駄にでかくなるから あとデストラクタもprivateにすることをお勧めする
質問です if ( 条件式 ){} というのがありますが、これって条件式は実際には実行されるのでしょうか? たとえば、関数func()があるとします。 if ( func() != 0 ){}などにした場合、関数自体は実行されちゃうのでしょうか?
そりゃされる
疑問に思ったことは実際に試してみたほうがいいよ 見聞きしただけで覚えたつもりになるのは良くない
あ、でも if (0 && func()) なんて条件式を使うと短絡評価が 働いてfunc()は実行されないからね 分かってると思うけど
76 :
69 :2009/12/21(月) 20:39:19
>>70 ありがとうございます。
継承するつもりはないのですが、
誰かが勝手に継承する可能性を考えてそれを封じる
必要がありました。
また、コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました。
そのため、
> 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
> デストラクタもprivateに
この3つを全て適用しようかな、と思っておりました。
・・・現実的にはやり過ぎですかね。
>>76 >誰かが勝手に継承する可能性を考えてそれを封じる
privateコンストラクタで封じれる
>コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました
ありません
まあ、それでも無理矢理作る方法はあるが、それはどうやったって防げないから無駄
純粋仮想関数は何の意味もない
やめとけ
78 :
77 :2009/12/21(月) 21:39:20
>>77 >ありません
おっしゃるとおりです。
すみません。。
privateコンストラクタでまず十分の様です。
ありがとうございました。
79 :
デフォルトの名無しさん :2009/12/21(月) 22:06:16
>>77 > それでも無理矢理作る方法はあるが
俺思いつかないんだけど、それってどうやるの?
(そのクラスのソースを直接改変するわけじゃないよね?)
#define private public #include"MyClass.h" (MyClass*)malloc(sizeof(MyClass)); reinterpret_cast<MyClass*>(new char[sizeof(MyClass)]); void MyClass::foo<Dummy>(){ x = new MyClass; } f=dlsym(RTDL_DEFAULT, "_Z7MyClassXX...(MyClass::MyClassのマングル名)"); class MyClass2{ char a[sizeof(MyClass)]; MyClass2(){f(this);} } 適当に思いついただけ もちろんほとんどは規格違反か使える状況が限られてる
>>80 おう!すげーな。
特に1つ目なんかもう。
サンクス。
>>80 1つめと似たようなものがよくマ板の会社辞めようと思ったソーススレに貼ってあるようなw
一つ目って(MyClass*)malloc(sizeof(MyClass));の事だと思って「あー確かにnewあるのにC時代のアロケート関数は嫌だね」って思ってたら #define private publicでふいたw
未定義動作の解説なんて要らんよ。
特定の処理系でならちゃんと動作を説明できるのに規約違反の何をもって未定義とするか。 規約違反したらどんな事でも鼻から精液出てくるとでも思ってるのかね。
その処理系のスレですればいいだろ
>>86 何をもって未定義とするかって、そりゃ、規格で未定義の動作と定められているものだろうよ。
> void MyClass::foo<Dummy>(){ x = new MyClass; } これってメンバ関数テンプレートがあった場合の話だよね? 自前のクラスにメンバ関数テンプレートを装備した場合、こんな感じで private メンバを悪用する手段になっちゃうのはしょうがないのかな?
悪意を持ってやってる奴は何やっても止められないから その辺は割り切るしかない
その通り #define private public なんてやられるともう何をやっても止められない
なんでまたそれ書いたん?
#define private public こういうのもっと教えてくれw
ゲッタセッタ教信者が発狂する様な一行だね
#define class struct
>>95 それ、アクセス指定子をちゃんと書いてれば意味ないような。
アクセス指定子を書かないとエラーになるobject_typeとかを作るべき
98 :
デフォルトの名無しさん :2009/12/22(火) 22:11:28
とりあえず予約語をマクロで置換するなんて、
未定義の動作も甚だしい。
>>86 > 特定の処理系でならちゃんと動作を説明できるのに
お前、まさかとは思うが
未定義の動作
って何か知らない・・・なんてことはないよな?
お前のレスを見ている限り、激しい無知っぷり以外伝わってこないんだが。
>>94 > ゲッタセッタ教信者が発狂する様な一行だね
ゲッタセッタ狂信者もantiゲッタセッタ信者も、
どっちにもたたかれる一行だなw
getsetの話なんだけどこういう書き方ってあまり見ないけど嫌われてるの? get〜set〜を排除できると書いてて結構気持ちイイと思うんだけど class Widget { private: class Member { public: Member &operator = (int value) { value_ = value; return *this; } operator int (void) const { return value_; } private: int value_; }; public: Member member; }; int main(void) { Widget widget; std::cout << (widget.member = 100) << std::endl; return 0; }
>>100 get、setを排除するのは、クラスの外からクラスの中身を見えなくする隠蔽が目的なんだね。get、setを使わなければいいというものではない。
クラスを隠蔽して外から見た挙動が適切なら、クラスの中はどんなにスパゲッティでも問題ない。
使う方は問題ないだろうが、メンテするときのことも考えたほうがいい
103 :
デフォルトの名無しさん :2009/12/23(水) 02:34:50
ヘッダの先頭に #undef private をつけたらエラーの山・・・・・・
ヘッダの頭にこれ書いて自衛するしかないな… #if defined(private) || defined(protected) || defined(class) #error やめろ馬鹿 #endif
#undef private #undef protected #undef class #if defined(private) || defined(protected) || defined(class) #error やめろ馬鹿 #endif #define private public #define protected public #define class struct
#define explicit なんてこったい
#define const
>>109 それだとコンパイルエラーが出ることがあるだろう。
だから
const_cast<T>()
static_cast<T>()
あたりを全部自作テンプレートになおして
T()
これでかんぺき
テンプレート引数の型にclassを使うようにしたのは #define class structを防止するためだったのか。 privateとかも他に何かの役割を持たせればよかったのに。
#define private private class Hoge { private: Fuga fuga; }; #undef private これでおk
すいません毎度の事ながら質問させていただきます int いんと char ちゃー ←読み方これでいいですか?それとも文字の意味でキャラですか?
>>113 ちゃーでもきゃらでも好きな呼び方でい
ただししーえっちえーあーるだけはナシな
ちゃーで合ってるよ
チャー派 キャラ派 チャル派 シャア派 char c; ちゃーしー きゃらしー ちゃるしー しゃあしー 読みやすいものでいいぞ。
文字型
符号付1バイト整数型
wchar_tは「わいちゃらっと」?
122 :
デフォルトの名無しさん :2009/12/23(水) 15:58:17
文字型って呼べよバカどもw
ワイド(文字)型
そのスレなんでマ板にあるんだろ ム板向きの内容だろうに
>>100 行く行くは可変引数テンプレートと多重継承使ってウンコテクニック披露する輩が出てきそうな志向だな
結局のところ馴れ合いに終始することになるので
TCHARは両型でいいよ面倒くさいから
メモリリークのチェックをしたい場合、グローバルのoperator newとoperator deleteでカウントすれば十分ですかね?
つ purify
>128 Boost.Property がこの方向だと思う。Boost ってついてるけど Boost 公式じゃない。
135 :
デフォルトの名無しさん :2009/12/24(木) 06:20:08
禿様が個人的に推奨してるのは CamelCase camel_case camelCase のどれだっけ?
その中にキャメルケーシングなものは1つしかないのではないかと
下半身全裸になって用をたすとか
好きにしろよ他人に強要するなな感じのテクニック?
>>128
138 :
135 :2009/12/24(木) 11:13:10
>136 その程度の枝葉末節は知った上でめんどくさいからCamelCaseで書いたに決まってんじゃん。 そんなに気になるなら BjarneStroustrup bjarne_stroustrup bjarneStroustrup これで。
VC++使ってるんですが、メインとは別に自分が思いついたことがあってるか実験的に確かめるために短いテストコードみたいなの書くときありますよね? それをコンパイルしようとするとプロジェクトのメインで書いておいたものがコンパイルされてしまい、わざわざ別のプロジェクトだして、コンパイルするんですがめんどくさくてなりません。 同じプロジェクト内に別のcpp作ってテスト的にそれだけコンパイルする方法ってないですか?
141 :
デフォルトの名無しさん :2009/12/24(木) 14:12:03
諦めろ
出来る。可能だよ。方法は自分で探せ
「ソリューション」 (.NET 以前なら「ワークスペース」) の中には 複数のプロジェクトを追加できるわけで。
実験ロジックを書くためのメソッドを用意しておき、メインから呼ぶようにしておく 実験したくなったらメソッドにかく
146 :
デフォルトの名無しさん :2009/12/24(木) 17:14:02
というかそもそもスレ違い…とまでは行かないがもっと適切なスレがあるのではないか?
using namespace std;と書くと名前が衝突するので、 あまり良くないと言いますが何故ですか? だって、標準のライブラリー群だから、そこら辺を考えて設計してるでしょ(知らないけど)
名前が衝突するのを考えて作られてるんだからstd空間に入ってるんだが 嫌ならローカルスコープで名前エイリアス作れば良いよ
>>139 ありがとう。
> I prefer to use underscores to separate words in an identifier (e.g, element_count)
> rather than alternatives, such as elementCount and ElementCount.
> Never use names with all capital letter (e.g., BEGIN_TRANSACTION)
> because that's conventionally reserved for macros. Even if you don't use macros,
> someone might have littered your header files with them. Use an initial capital letter
> for types (e.g., Square and Graph). The C++ language and standard library don't use
> capital letters, so it's int rather than Int and string rather than String.
> That way, you can recognize the standard types.
これだこれ。
把握力の無い低能が出典見つけて騒喜してるだけ SVNにも載せてない様な.cppにusingして文句言われる筋合いは無い と書くとファビョり始めるかな
Cとの互換などから今後も、グローバル名前空間に 標準や準標準の関数などが増えてゆくからだったと思う。 まあ、言語設計上のミスだよねこれ。
>>147 > そこら辺を考えて設計してるでしょ(知らないけど)
はい?何を言っているのだ?
ライブラリーとかいう言い回しからしても余り詳しくないっぽいな。
using namespace std;
swap(MyClass());
と
using std::swap;
swap(MyClass());
の違いが分からないレベルなら
using namespace std;など使うな。
>>152 名前空間に対するusingの話をしているのに何いきなりusing std::swap;とか引き合いに出しちゃってるの?w
文脈が分からないレベルなら日本語を勉強しましょうねw
namespace std { using ::swap; }
>>152 普通に考えて質問者は、わからなくて質問してるんだから
ムキにならなくてもいいと思うよ
>>152 詳しくないって分かるなら教えてあげれば良いのに人の揚げ足取ってばかりで現実でも人望なさそう。
152の人気に嫉妬
158 :
デフォルトの名無しさん :2009/12/24(木) 21:18:52
>>151 ということはグローバル空間そのものを否定するか?
初心者が書くコードにいきなりクラスメソッドが出てくるアレなら設計ミスがなかったとでも?
159 :
デフォルトの名無しさん :2009/12/24(木) 21:41:42
>>152 の盛大な釣り
/ ヽ
>>152 ,/ ヽ
. ∧_∧ ,/ ヽ
( ´∀`) ,/ ヽ
( つ@ ヽ
.__ | | | ヽ
|――| (__)_) ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ヽ
/⌒\/⌒\/⌒\/⌒\|彡~゚ ゜~ ~。゜ ~ ~ ~ ~~ ~ ~~ ~ ~~ ~~ ~~
⌒\/⌒\/⌒\/⌒\/⌒\彡 〜 〜〜 〜〜 〜〜 〜 〜
│
│
│
人人人人人人人 ∧J∧
< > ( / ⌒ヽ
< 吊られちゃった > | | | >>○
< > ∪ / ノ
∨∨∨∨∨∨∨ | ||
∪∪
>>153
160 :
147 :2009/12/24(木) 21:52:51
>>160 おk。
>>152 も、
> > そこら辺を考えて設計してるでしょ(知らないけど)
> はい?何を言っているのだ?
このやりとりを
> > そこら辺を考えて設計してるでしょ(知らないけど)
> いいえ、名前が衝突することは標準のstd名前空間といえども
> 特別な対応策がなされているわけではありません。
と解釈するなら信じておk。
162 :
147 :2009/12/24(木) 22:09:41
>>161 お〜おぉ、助かりました
ありがとうございます
あるクラスの実装を隠蔽してインターフェースだけを提供したいです
返り値などの一時オブジェクトの場合にそれを実現する方法はありますか?
感覚的には↓のようなことがしたいです
http://codepad.org/dhFsqyT1 スマポを使えば可能なんですが、動的確保はコストが気になるので避けたいです
>>165 本当に動的確保のコストが問題になるレベルなのか検討してみるのもいいかもね。
戻り値で返そうとするなら、GetFinalWidgetを受け取る側がLocalWidgetの大きさを知らないといけない。 逆にそれを隠蔽しようというのだから、どうやっても動的確保するしかないと思う。
168 :
デフォルトの名無しさん :2009/12/25(金) 11:49:00
C は GNU Core Utilities JavaScript は jquery.js や prototype.js などのライブラリ などを言語学習には読んでトレースして改造すると 自分にとってすんなり覚えられたのですが、 C++ の場合はどういうものが挙げられますでしょうか?教えやがってください。
暗黙的の型変換をする場合にstatic_castがありますが、本当に使っていますか? dynamic_castとかは便利そうなので、使っている人が多そうですけど
double -> int とかの型変換用だっけ?
キャストってのは弱虫のマンモーニが使うもの 使わなくても良いように設計できるならそうする APIやライブラリのせいで使わなくてはいけない状況なら使うが 使わなければいけないように設計することは避けたい
ドリームキャスト
>>169 インスタンスの本来の型が分かっている場合のダウンキャストとか
reinterpret_cast 最強〜!
bregonig.dllってperlの正規表現ができるってあったのですが、つまりはc++でperlを取り入れることができるって意味でいいのでしょうか?
+とか(?=とかのパターン指定がPerlと互換だというだけのこと。
そうなのですか
>>177 さんありがとう
Perlの埋め込みはまた別なのですね
>>175 多重継承したクラスを扱うときは気を付けろよ
c++でヌル文字が途中で入ってる配列の途中からファイルをコピーしたいでござる どうすればいいでやんす?
照れんなよ
std::ios::binary
>>182 サンキューでござる
くわしくしらべてみるでおじゃるまる
>>169 dynamic_castよりstatic_castを使う。
理由はstatic_castの方がが速いから。
馬鹿か。 コンパイルタイムにキャストを解決できる時にstatic_castを、動的型付けなオブジェクトに対するキャストではdynamic_castだろうが。
>>169 dynamic_castなんて使ってないよ。
大して便利じゃないというか使わなきゃならない状況にならない。
static_castと比較するもなにも、そもそも用途がぜーんぜん違う。
httpのメッセージボディのgzipをデコードするにはどうしたらいいですか?
気合いでデコードしましょう。
>>184 そういうときはboost::polymorphic_downcastがおすすめ。
>>187 zlibでも使え。
template<typename To, typename From> inline To dream_cast(const From &from) { return (To)from; }
zlibってインタフェースがわかりにくくね? わかっちゃうと効率的ですげーなと思うけど
193 :
デフォルトの名無しさん :2009/12/26(土) 11:49:56
質問があります。 動的に確保した配列にdelete[]を実行すると、しっかりと配列は解放されますよね? メモリのどこかに配列の長さが格納されていると踏んだのですが… 一体どこに格納されているのでしょうか? それとも格納はされていないのですか?
格納されていますが、それがどこにどのように格納されているかは規定されていませんのでわかりません
195 :
193 :2009/12/26(土) 12:00:02
VC+Win32 あたりでお願いします
>>193 型によっては必要ないので、どこにも格納されてないこともある。
格納されていたとしても、ユーザーがそれを取り出す手段はない。
配列 new/delete なんか使わずに std::vector 使うのがおすすめ。
要素数もちゃんとある。
>>193 まず、
クラスのカプセル化という概念を知っているか?
インターフェースだけ理解させてそのクラスの内部の実装は
ブラックボックスにして触れなくて良いようにし、
また触れることを禁じていること。
> メモリのどこかに配列の長さが格納されていると踏んだのですが…
君と同じ発想でコンパイラの作者が作っていればそうなる。
だが上述のクラスのカプセル化と似たように、
どこに長さが格納されて居るだとかそう言った実装については
触れないし触れてはならないことなのだ。
vectorって初期化が大変だよな・・・ 早くC++0xこないかな
>>198 それでも配列 new よりはマシだろ。
vectorの値コピーのコストってどれくらい?
vectorは大量の要素を持った時、アクセスの実行速度が気になる
>>202 アクセスは O(1) だから、それは勘違い。
普通のO(1)じゃないだろ たまに猛烈に時間がかかるけどたまにだから平均したらO(1)っていうやつ
>>206 それは末尾追加( push_back() )の計算時間な。
アクセスはランダムアクセス可能で O(1) だよ。
もうソース読めよw
stlのmapにpush_backしていくと自動的にサイズが増えていくとのことですが、 処理速度向上のため初期サイズを予め決めておくことはできますでしょうか。
boost::fast_pool_alloc
あれー? どっかに「このドキュメントでは計算量と言えば全部amortizedのことですよー」って書いてなかったっけ
>>210 std::map に push_back() はありません。 insert() のことでしょうか?
メモリ確保のために必要な時間が(ほんとうに)問題だということなら、
operator new (およびその下層)の置き換えやカスタム Allocator の指定が
使えるかもしれません。
>>212 そのドキュメントにそう書いてあったとしても、標準規格に書いてないなら関係ないね。
>>213 すいませんinsertの間違いでした。
vectorのreserveに相当する関数はないのでしょうか。
qt4を使いたいが為にC++の勉強を始めたわけですが、qtにはQ_OBJECTってマクロがあるそうです マクロって奴はパラーメタ必須ってイメージがありますが、そういうわけじゃないんですかね? そして、マクロから普通のコードを読み込めましたよね?
日本語でおk
>>217 > マクロって奴はパラーメタ必須ってイメージがありますが
そんなイメージねぇよww
パラーメタ・・・は まあ おいとく として、どこの言語から来た人?
C系列じゃないよね?
> そして、マクロから普通のコードを読み込めましたよね?
このスレにエスパーはいらっしゃいませんか?
呼んだ?
1行目だけ意味がわかる。
>>220 もうこれ以上スプーン曲げないでくれ。
分かったら帰ってくれ。
224 :
217 :2009/12/26(土) 19:55:30
>>219 javaから来た人間です
C言語はあんまりわかりません
>マクロから普通のコードを読み込めましたよね?
IOCCCの作品に1文字しか書いていないプログラムがあったような〜
マクロから読み込む、という表現がそもそも意味不明なんですよ。 唯一わかるのは、マクロについて根本的な何かを勘違いしているんだろうな、ということで。
ひょっとして#includeのことではないか? だとしても意味はわからない
std::coutはストリームなんですよね std::cout << "hoge"; みたいに、ストリームをフラッシュしないで終了しているコードがあるわけですが 大丈夫なんですかね?
>>226 うん。
彼の言うマクロが#includeだとすると、確かに3行目は成立するが、
今度は1行目と2行目がつながらなくなる。
頼む、もうちょっと日本語でおk
マクロは俺の認識だと「文字列をあるルールに従って置換する」なんだけど、あってる? マクロアセンブラなんかだと簡単な計算もできるのが多いけど、 Cプリプロセッサはそこまでじゃないよね。
>>229 > マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
> Cプリプロセッサはそこまでじゃないよね。
何十年前の話をしているのだい?
そもそもプリプロセス処理というものは…(ryめんどくさ
232 :
227 :2009/12/26(土) 20:35:47
>>227 プログラム終了時に閉じられるから問題ない。
Boost.Preprocessor はもう天才的。 プリプロセッサメタプログラミングだぜ? 本当にやりやがった・・・的な衝撃が走る。
楽になると人間堕落が進むのさ 学習しなくなるから使わないほうがいいよ
>>236 それは違うな
使わなければ学習していくとは限らない
むしろ、使わない方法で満足する場合、それ以上の学習をしなくなる可能性もある。
つまり楽になることと学習しなくなることに強い因果関係はない
そんなようなことを言ってバカにされたのが前スレに居たな。
239 :
238 :2009/12/26(土) 20:53:52
おっとごめん。 >238 は
>>236 宛てね。
>>236 君は全部アセンブラでコードを書くのですか?
virtualがついたメンバ関数は、抽象メソッドではないのですか? virtualがついたメンバも実装をしている場合があるので
>>241 virtual がついていればオーバーライド可能になります。
virtual に加えて = 0 がついていれば、オーバーライドが必須(抽象メソッド?)になります。
243 :
デフォルトの名無しさん :2009/12/27(日) 11:52:40
244 :
243 :2009/12/27(日) 11:53:57
>>242 > virtual がついていればオーバーライド可能になります。
(まあ初心者向けに教えるならそれでも良いかもしれないが)
別にvirtual付いて無くても、オーバーライド可能か不可能かと言えば
一応可能だよな。デザインとして良いかどうかはともかく。
抽象メソッドは abstract methodだろ?
純粋仮想関数のことか
247 :
241 :2009/12/27(日) 12:02:19
>>243 ひとまず、読んでみます
ありがとうございました
>>244 はメソッドの隠蔽と勘違いしてるんじゃないだろうか。
250 :
243 :2009/12/27(日) 12:28:07
>>248 親クラスのメンバ関数をオーバーライドする・・・って話だよな?
どうやってもなにも、普通にできるじゃん。
(俺の > オーバーライド可能か不可能かと言えば一応可能)
ただし親クラスのポインタから呼び出したときに
子クラスのメンバ関数は呼び出されないが。
(俺の> デザインとして良いかどうかはともかく。)
>>249 していないよ。
>>249 「override」って言葉の意味分からないなら語るな。
>>250 >ただし親クラスのポインタから呼び出したときに
>子クラスのメンバ関数は呼び出されないが。
それってオーバーライドしてないじゃん
>>250 君はオーバーライドを知っているのか?
C++ のオーバーライドをわかっているか?
10.3 Virtual functions p2 より
> If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly from Base, a member
> function vf with the same name and same parameter list as Base::vf is
> declared, then Derived::vf is also virtual (whether or not it is so
> declared) and it overrides Base::vf.
なにか話がかみ合ってないな
ポリモーフィズムとオーバーライドがごっちゃになってるんじゃないかな? だから仮想関数の話が出てくるんだと思う。
基底クラスと派生クラスに同名のメンバ関数が存在することがオーバーライド それ以上の意味はない
>>256 同じシグネチャのメンバー関数
とした方がいいかな。
特にコンストラクタのオーバーロード(引数が違う)があるとややこしいので。
>>253 の英文は
class Foo { public: virtual void A() ...
class Bar : public Foo { public: void A() ... (1)
class Bar : class Foo { public: virtual void A() ... (2)
Fooを継承するときにAが仮想関数だったら(1)も(2)も同じoverrideとあるな。
Foo::Aのvirtualを外したらやっぱり隠蔽だろ。
>class Bar : class Foo { public: virtual void A() ... (2) class Bar : public Foo { public: virtual void A() ... (2) のtypo
>>258 違いますよ。
それは「override」って言葉の定義、
特に十分条件を説明をするための例じゃない。
どういう時にvirtualなのかって例。
子クラスでvirtual宣言せんでもいいよって話。
>>260 >子クラスでvirtual宣言せんでもいいよって話。
おれもそう解釈してて、
>>253 の引用は的外れだといいたいのだが。
議論してるのはC++でのoiverrideの意味や用い方についてだよな?
>>260 何を根拠にそんなこと言ってんの?
>>253 の引用箇所の最後にある "overrides" は PDF ではイタリック体で表記されている。
これは用語の定義を示す。
1.3 Definitions p2 より
> Terms that are used only in a small portion of this International
> Standard are defined where they are used and italicized where they are
> defined.
ちなみに、「子クラスでvirtual宣言せんでもいいよって話」は "overrides" に添えられた 注釈で記載してある。
265 :
243 :2009/12/27(日) 13:21:39
昼飯 食い終わって見てみたら なんだかすごい沢山レスが付いててびびった。 そして全ては私の誤りでございました。 さーせん。 ISO IEC 14882:2003 によれば > struct B { > virtual void f(int); > virtual void f(char); > void g(int); > void h(int); > }; > struct D : B { > using B::f; > void f(int); // OK: D::f(int) overrides B::f(int); > using B::g; > void g(char); // OK > using B::h; > void h(int); // OK: D::h(int) hides B::h(int) > }; まじさーせん。
C++っていいよな。 こういう議論がちゃんと(仕様書にあるように)決着付くんだもん。 2chではある意味貴重とも言える。
267 :
266 :2009/12/27(日) 13:26:09
× 仕様書にあるように ○ 仕様書がルールブックとして機能するため
× 仕様書 ○ 規格
× 仕様書がルールブックとして機能するため ○ 仕様書なんかクソくらえ
ちなみに 「標準C++(ISO C++)の規格」 って英語で何て言うの?
Standard C++
>>266 C++ではCでえらく話がループしまくったmalloc/freeについては
どう定義されてるのかな
new/deleteも同じ問題だと思うけど
>>270 「標準」も「規格」も "Standard" だから、日本語でも「標準C++(ISO C++)の規格」なんて言わない。
>>274 そういう安価は馬鹿でも付ける事ができる
ここで聞いてんだから何か言えよ
その論争の概略なり、該当スレとその範囲のリンク張るなりしないと。 手を抜きすぎるからいろいろ食い違う
277 :
270 :2009/12/27(日) 14:24:34
C++の標準規格のことを 標準C++ と呼ぶってわけね。
>>278 うむ。
今回は本当に全面的に俺の誤りであった。
2010年はもっと腰を低くします。
>>277 「標準規格」だと standard standard になるから、どっちかひとつでいい。
281 :
270 :2009/12/27(日) 15:14:47
日本語での規格はconfigurationの意味合いだから標準規格でも別にいいと思うけど 英語ではわざわざ言わないってだけで
specificationって言いたいのか? 規格化=standardizationだぞ。 規則の「規」に定格の「格」 stardard specificationで標準仕様。 日本語も英語も形容だけ取って、 標準、規格、stardardということがあるし、 用法が定着しているから、 この短い表現も辞書に載ってる。
だから「標準」と「規格」は日本語で意味違うだろ 「標準外規格」っていう言葉もあるんだし どっちも英語でstandardだから日本語でも同じ意味であるべきというのは横暴
規格がconfigurationの意味ってのは全然違う
あっそ
標準規格 standard of measure
>>287 「標準的でない規格」と「規格に従ってないもの」は違うだろ
HD-DVDとCCCDを同じと言ってるような乱暴さを感じる
class Sub : private Super privateのメリットがわかりません。どなたか教えてください
sizeof()って型がいまいちよくわかりません。奴は何者ですか? unsigned longとかいってるHPありますが、引数にint func( unsined long num)なんてあったら引数に渡しても大丈夫なんですか? 今までint func( size_t )こんな関数の引数に渡したことくらいしかないのでわからないんですが
typeid(sizeof(int)).name()してみろ
size_tが何者かは処理系定義
>>290 class Super {
public:
void f();
};
class Sub : private Super {
};
void g() {
Sub().f(); // fにアクセスできない
}
>>289 なら違いがわかるように「標準的でない規格」って言えよ。
「標準」をそういう意味に使うとしても C++ の規格を指して「標準規格」と呼ぶのが
冗長であることに変わりはない。「標準」以外に「やさしい」とか「むずかしい」とかいう
程度があるものじゃないんだから。
>>295 日本語の「標準」にはそういう意味しかないんだけど?
「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない
「標準規格」で初めて英語のStandardに近い意味合いになる
日本語と英語は一対一に対応してるわけではないんだけどなぁ
日本の英語教育と国語教育のせいかな
>>296 > 日本語の「標準」にはそういう意味しかないんだけど?
ひょうじゅん【標準】の意味 国語辞典 - goo辞書
http://dictionary.goo.ne.jp/leaf/jn/165187/m0u/%E6%A8%99%E6%BA%96/ > (1)物事を行う場合のよりどころとなるもの。
なんでちょっと辞書引くだけの確認もせずに自分の脳内設定が正しいと言い切っちゃうの?
> 「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない
C++ の規格(あるいは標準)と言った場合にそれ自体に遍く使われているという意味はない。
そういう意味を込めたいなら ISO の規格だとか JIS の規格だとか言えばいい。
わざわざ似たような意味の言葉をならべて意味が不明瞭になる可能性を高める必要はない。
スマートポインタを使うためには、クラスも変更しなければならないのですか?
ないよ。
>>298 スマートポインタの設計によります。
std::auto_ptr, boost::shared_ptr, boost::scoped_ptr などは、それを使うためにクラス側の
変更を必要としません。
boost::intrusive_ptr はクラス側で準備してやる必要があります。このような性質を、
「侵入的」 "intrusive" といいます。
> 「侵入的」 "intrusive" といいます。 へぇへぇへぇ。298じゃないけど勉強になった。
CやC++て、 void foo(){std::cout << std::endl;} という関数を定義することができるよね? このfoo()は戻り値をあたかも返していないように見えるが、 実際は返している。ただしその値を取得しようとするとコンパイルエラーとなる ・・・という理解であってますか?
戻り値が無い(void) でいいじゃん
>>303 foo()の戻り値を無理矢理取得することはできませんかね?
305 :
298 :2009/12/28(月) 10:05:27
>>306 未定義でもいいんでコンパイルエラーにならないで
無理矢理コンパイル通したいです。
・・・1回だけでもやってみたいです。
>>307 おそらく意味不明な値が返ってくると思っています。
std::coutにでも渡して表示させて見ようと思っています、
なんでやりたいの?
>>302 最初の理解からして間違ってる。 void foo() は戻り値を返してなどいない。
ゴミを表示したいんなら別のコンパイル単位で int foo(); とでも宣言して
呼び出してみるといいかもしれない。プログラムがクラッシュするかもしれないけど。
void型の関数は値を返せない。
関数っていう名前紛らわしいよな。 サブルーチンとかって命名すればこんな下らない事考える奴出てこなかったのに
pascal まんせー
>>308 std::cout << "result = " << ((int(*)())foo)() << std::endl;
でも void * p ってのは何故か意味があるんだよな。 これがまた紛らわしい。 なんでこうなっちゃったの?予約語を増やしたくなかったからとか?
デニス・リッチーに訊け
>>317 テンプレートで参照外ししようとしてはまるよな
>>320 インターフェイスくらい最初に決めとけカス
>>317 何が紛らわしいのかさっぱり
any * としなさいってこと?
char *と違って、うっかりdereference出来ない素晴らしい機構 それがvoid *
そんなところで紛らわしいなんて感じている様じゃ。。。
void * は指し示す型を特定しない=総称ポインタとして考えてはまずい?
327 :
317 :2009/12/28(月) 12:20:03
型が定まってないポインターなら NULL * p っていうものの方がよかったと思う。
>>327 どこに利点が? NULL はマクロだし。
アホはスルーで。
NULL は無効なポインタを意味するから、文脈で出てくると 型なのか無効なのか不明瞭になるのかも
voidのさみしいところは、馬鹿には分かりにくい単語だって事。
>>326 それはchar *
void *は出来ないことがたくさんある。
>>325 テンプレートクラスのインスタンス化時にメンバー関数の引数や戻りにvoidが現れると、その関数を呼ばなくてもエラーになるんだわ
見逃してくれよ
>>334 当然じゃないの?
エラーにならないとしたら、どんなコードでどんな動作が期待できてうれしいの?
>>335 基本的にはT*を扱うテンプレートクラスで参照外し関数をおまけで作るとはまる
void *特殊化はイディオムなんで填まるヤツなんていない。
>>333 ヘ_ヘ
ミ ・ ・ ミ < はつみみです
( ° )〜
340 :
デフォルトの名無しさん :2009/12/28(月) 14:12:31
template<class T> struct my_numpunct : public std::numpunct<T> { typedef typename std::numpunct<T>::char_type char_type; char_type do_thousands_sep() const{ return ';'; } }; int main() { std::locale loc(std::locale("japanese"), &std::use_facet<my_numpunct<char> >(std::locale("japanese"))); std::locale::global(loc1); std::cout.imbue(loc1); int x = 123456789; std::cout << 123456789 << "\n"; std::stringstream ss; ss << x; std::cout << ss.str() << "\n"; } 出力結果が 123;456;789 123;456;789 となることを期待したのですが、そうなりません。 do_thousands_sepをoverrideするだけでは駄目なんですか?
341 :
340 :2009/12/28(月) 14:18:47
>>340 std::locale::global(loc1);
std::cout.imbue(loc1);
は
std::locale::global(loc);
std::cout.imbue(loc);
の間違いです
void *に出来ないことって何?
もしもvoidのケツの穴のことだったら出来ないことよりも、 出来ることを数えた方が速いと思われる。
>>340 どこの桁で区切るかという指定も必要。
my_numpunctにこれを加えてみて。
std::string do_grouping() const {return "\3";}
int i; cout << i; これで未定義の動作なわけだが、 実際には訳の分からん数が出力されたりする。 これを乱数として使うのはだめなの? 現実的に。
346 :
340 :2009/12/28(月) 18:18:05
>>344 それも書いてみたんですが、;で区切られないです。
>>345 >これを乱数として使うのはだめなの?
ダメダヨ♪
>>345 無理
だいたい似たような結果がでる
場合によっては予測可能
>>348 そうなんですか。
まあ確かに。
おとなしくboostの乱数でも使います。
コンパイル時間を減らすための工夫とかってあるんでしょか
ありますよ
>>344 ああ、ごめん。ちゃんと確かめていなかった。
ここも直す必要がある。
std::locale loc(std::locale("japanese"), new my_numpunct<char>);
use_facetは引数のlocaleオブジェクトからfacetを取り出す関数なので、
>>340 では無い物ねだりになっている。
新しくfacetオブジェクトをセットするときには直接newする。
355 :
340 :2009/12/28(月) 20:45:34
pimplとshared_ptrって相性良いように見えるけど実際は微妙。 shared_ptrは浅いコピーだからpimplを単純に使うと pimpl無しとクラスの挙動が変わるのが面倒。 深いコピーをするshared_ptrみたいなものがboostに採択されてほしいなぁ。
っ boost::any
クラス作成時点ですでに実装を隠したいとわかっているなら、 抽象インターフェースと .cpp ローカルな実装クラスを作ったほうがよくないか? 委譲コードをぺたぺた書いていく必要も無いし、あとで特殊な実装を作って 差し替えることも楽にできるようになる。 後出しで依存を減らさないといけないときは pimpl が便利だろうとは思う。
自動変数で使える ファクトリがいらない 使う側が特に作業無しで継承できる pimplの利点はこんなもんかね?
pimplの利点 swap の実装が楽 STLに突っ込みやすい
親クラスの実装部を書き換えてスロットが増減しても、
引き摺られて子クラスのスロットの位置が変らないから、
ライブラリのみの差し換えができるようになる。
つまりbinary interfaceが安定する。
だから子クラスをコンパイルし直す必要もない。
これがもともとの目的だった。
>>356 はそういうことを言っている。
>>360 はそこを理解しているのかどうか
>358
一度 Pimpl Pointer がレビューで reject されて、現在 Pimpl がレビュースケジュール上に載ってるね。
マネージャ未定だけど。紹介は↓
ttp://www.ddj.com/cpp/205918714 もはやポインタ周りは見えないようになってるけど、値セマンティクス(深いコピー)とポインタセマンティクス(浅いコピー)と
継承する段階で切り替えられるみたい。
>>365 さんきゅー。そういうものが提案されてたのか。
ただ、見てみたけど微妙w
色々やりたいのは伝わってくるけど
それぞれの目的別のスマートポインタで実現したほうが楽な気がする。
現状だと特に継承周りで色々構文に無理がある。
実装までは見てないから実際実装見てみないと若干思い違いしてるかもだけど
>>363 抽象インターフェースを使う方法でもその目的は達成できるでしょ。
実装継承はやりにくくなるけど、あんまり使わないな。
>>366 大丈夫大丈夫。
その辺の事情はboostに載る頃には
天才達による厳しいチェックと構成を乗り越えているものになっているだろうし。
>>367 アホ過ぎて話にならない。
初心者スレで勉強しなおせ。
>>369 ん?何かおかしなこと言ってる?
具体的に言ってもらえると助かる。
別人だが横レス。
>>370 抽象インターフェースクラスを使うと
>親クラスの実装部を書き換えて
> 子クラスをコンパイルし直す必要もない。
って言いたいんだよね?
>>371 そうだよ。面倒だけどね。
class BaseInterface; // 親・抽象インターフェース
class BaseImpl : BaseInterface; // 親・実装クラス
class DerivedInterface : BaseInterface; // 子・抽象インターフェース
class DerivedImpl : DerivedInterface; // 子・実装クラス
STLのlistのerase(it, it)メンバってN個削除するとしたらコストO(N)であってますか?
374 :
371 :2009/12/29(火) 15:59:23
>>372 そのDerivedImplはどう実装すんの?
↓これ使ってちょ
class BaseInterface{ public: virtual void f() = 0; };
class BaseImpl : BaseInterface{ public: virtual void f(){}; };
class DerivedInterface : BaseInterface{};
class DerivedImpl : DerivedInterface{ ??? };
376 :
デフォルトの名無しさん :2009/12/29(火) 16:31:01
速報じゃないよな少なくとも。
ニュースでもないよな
ニュース速報板がどういう板か知らないのか
>>375 ほい。
// Base.hpp
class BaseInterface { public: virtual void f() = 0; };
BaseInterface* new_Base();
// Base.cpp
class BaseImpl : public BaseInterface { public: virtual void f(){} };
BaseInterface* new_Base() { return new BaseImpl(); }
// Derived.hpp
class DerivedInterface : public BaseInterface { public: virtual void g() = 0; };
DerivedInterface* new_Derived();
// Derived.cpp
#include <memory>
class DerivedImpl : public DerivedInterface
{
public:
DerivedImpl() : base(new_Base()) {}
virtual void f() { base->f(); }
virtual void g() {}
private:
std::auto_ptr<BaseInterface> const base;
};
DerivedInterface* new_Derived() { return new DerivedImpl(); }
382 :
381 :2009/12/29(火) 22:45:14
要は void f() { base->f(); } だとか void f() { pimpl->f(); } だとかいう委譲コードが 必要になるタイミングがが違う、ってことみたい。 pimpl だと最初に作るとき。 抽象インターフェース+継承だと、実装継承をするとき。 普段から実装継承を避ける方針を採っていると、後者の方法にすることで (実装を隠すためだけの)委譲コードというものがほぼ発生しなくなってうれしい ような気がする。
abortした場合mainの自動変数は安全にデストラクトされる?されない?
>383 > 14882:2003 3.6.3p4 > Calling the function > void abort(); > declared in <cstdlib> terminates the program without executing destructors for objects of automatic or > static storage duration and without calling the functions passed to atexit().
ちょう、アホ臭い質問をさせてください NetBeansでC++の勉強をしているのですが、 ソースファイル/ヘッダファイル/リソースファイルの3つがあります ソースファイル以外の使い道がわかりません 何方かおしえてください
C言語 分割コンパイル でぐぐれ
ソースはプログラム本体 ヘッダは1つ以上のソースからインクルードされることを想定したソースの一種 リソースファイルはそれらとは別でプログラムからは独立したデータ集を記述したもの
388 :
385 :2009/12/30(水) 15:47:13
>>387 新規作成→C++クラスを選択すると、ソースファイルに「*.h,*.cpp」が作成されるんですが
そりゃ作成されるだろうね
>>387 ソースファイルが1本だったら大きくなりすぎるのでソースファイルを分割する。
cppが2つになったら、別のほうファイルのクラスを呼ぶ方法に困ってしまう。
で、呼び方を書いたclassの定義を.hに入れて両方のファイルで#includeしたらクラスを呼び出せて丸く収まる。
392 :
385 :2009/12/30(水) 17:10:49
>>389-340 新規作成→C++クラスを選択すると、ソースファイルに「*.h、*.cpp」が作成されるわけ
ソースファイルに「*.cpp」、ヘッダファイルに「*.h」が作成されるわけじゃない
基本的に、 ヘッダには関数やクラスなどのインターフェイスを記述する。 ソースにはこれらの実装を記述する。
そんなんNetBeansのとこで聞けよ 別にどこで作られたっていいだろ、何か困ってることがあるの?
std::auto_ptr<MyClass> x=(new MyClass); std::auto_ptr<MyClass> y=(new MyClass); std::swap(x, y); これって安全でしょうか?
396 :
395 :2009/12/30(水) 17:59:28
>>395 がshared_ptrなら安全だと聞いているのですが、
auto_ptrは仕様をあまり知らなくて。。。
お願いいたします。
安全ですよ
>>397 ありがとうございます。
auto_ptrがくそみそに言われているのを聞いて、
不安になりました。
>>398 auto_ptrは代入演算子で代入するとソース側を破壊する。
間違ってもSTLで使ってはいけない。
400 :
398 :2009/12/30(水) 18:33:41
>>399 std::auto_ptr<MyClass> x=(new MyClass);
std::auto_ptr<MyClass> y=(new MyClass);
これで
x=y;
としたとき、
xが指していたデータは勝手にdeleteされ、
yは無効なポインタとなり、
yが指していたデータをxが指すようになる
こんな動作で合っていますか?
あってるよ。だからSTLで使う場合はshared_ptrを使う。
class Sub : public virtual Super 継承される事を前提としたクラスを作成する時には、上のように宣言をするのが普通なのでしょうか? また、javaのswingでは何度も継承をしているため、まったく意味のないメソッドや害を成すメソッドが存在します C++ではこのような問題のあるメソッドに、どの様な対処をしているのですか?
計画的に継承させる
>>402 仮想継承はあまり使わないほうがいいよ。
class sub :public Superで十分。
無駄なメソッドがあるのは設計が不十分だと考えて、問題のないように設計しよう。
405 :
402 :2009/12/30(水) 19:14:54
>>400 次のC++の規格ではauto_ptrは非推奨になってunique_ptrに置き換わる。
だから今からなら仕様を覚えるより存在を忘れ去った方が良い気がする。
unique_ptrなら一応コンテナに放りこめる(ように実装できる)し。
まぁ次の規格が出るまでは素直にboostなりtr1のshared_ptr使えばいいと思う
unique_ptrってauto_ptrのコピー、代入ができないverと考えていいのか?
>>401 >>406 ありがとうございます。
私もfactoryは結構好きなのでboost::shared_ptr(ないしstd::tr1::shared_ptr)は
良く使っています。
お伺いしたいのですが、
std::auto_ptrとboost::shared_ptr(ないしstd::tr1::shared_ptr)は、
前者の方が不便な分 一般的に軽いと思って良いのでしょうか。
>>408 うん。
auto_ptrはオーバーヘッドが無い。
shared_ptrはshared_ptrの複製にわずかにコストがかかる。だから関数の引数で渡すときはshared_ptrの参照渡しにすると速い。
shared_ptrにポインタを最初に与えるときもコストがかかるが、newよりmake_sharedのほうが少し速い。
>>407 代入などの条件が微妙に厳しくなったものと思えばいい。
コピーは出来ない(代わりにムーブが出来る)
基本的にはほとんどいっしょ。
copyの代わりにmove(代入時に元のデータを破壊してもいい)を採用した物というのが正解。
auto_ptrはC++がmoveの概念を持っていないのを無理やりエミュレートしたしろもの
だから元のデータを破壊してはSTLとしては不整合が出るoperator=やコピーコンストラクタが実装されている
unique_ptrはmoveの概念(右辺値参照)がC++0xで採用されたから、
無理やり実装するのじゃなくて新しい機能を使って素直に実装したバージョン
STLとして不整合が出る操作がないのでコンテナにも放りこめる。
>>409 ありがとうございます。
make_sharedについてはちゃんと勉強して参ります。
助かりました。
412 :
デフォルトの名無しさん :2009/12/30(水) 20:15:23
C++での多重継承ってどのようなデメリットがあるんですか? template<class T> struct IConverter; template<class T> struct IClonable; class Base; class Converter : public Base, public IConverter<int>, public IClonable<Converter>; template<class T> T Convert(IConverter<T>* conv); void Hoge { Converter converter; int val = Convert<int>(converter); } って感じに使いたいのですが。
413 :
412 :2009/12/30(水) 20:16:53
実はもう上のコードにエラーとか潜んでたりします?
>>412 多重継承は自由すぎて、乱用すると複雑になってわかりにくくなる。
その例のように、インターフェースを意識するのはわかりやすい使い方として推奨されている。
ほかにデメリットというと、キャストしたときにポインタの値が変わることかな。
>>413 うん
template<class T> T Convert(const IConverter<T>& conv);
416 :
412 :2009/12/30(水) 20:25:38
上のような使い方は問題ないんですね。 ありがとうございます。
417 :
412 :2009/12/30(水) 20:27:54
>>415 すいません。
template<class T> T Convert(IConverter<T> *conv);
Convert<int>(&converter);
ってしたかったんです。
参照を使ったほうがいいんですかね??
テンプレート関数は型の特殊化ができない。
>>418 特殊化はできる。
部分特殊化ができない。
でも参照ってRAIIがあれだからイヤ! Hoge *p = NULL; // 〜 コード 〜 p = new Hoge(); // このタイミングを待っていた!
>>421 scoped_ptrもありだな。RAIIを語るならスマポを使わないと
425 :
デフォルトの名無しさん :2009/12/30(水) 20:41:10
ということでRAIIにおいては(スマート)ポインタってことだな
426 :
デフォルトの名無しさん :2009/12/30(水) 20:43:11
つかスマポを使うときには明示的に破棄できるクラスを作る俺は変態? class Resource { void Dispose(); }; みたいな。
>>426 別に、二重deleteにならないならいいんじゃない?
任意のタイミングでdeleteしたいときと、
shared_ptrとかに任せるときの2パターンできるようにするってことでしょ?
>>426 C#風味ですね。その機能はC++ではデストラクタが行う。
まぁfstreamにcloseメソッドがあるようなもんだろ。 べつに問題はないとおもうよ
431 :
デフォルトの名無しさん :2009/12/30(水) 20:47:31
参照使う関数にRAIIな感じなオブジェクトを渡すってなると void Reference(RAII &obj); // 〜〜〜 shared_ptr<RAII> obj; // 長々とコードとか Reference(*obj); // こんなのの繰り返し・・・? とかダサいことになる。
おもしろい議論だ。 誰かスレでも立てて〜 >< 【RAII】C++で [*]ポインタ vs 参照[&]【安全】
433 :
426 :2009/12/30(水) 20:51:06
>>429 そう。それです。
C#ばっかやってたらこれがやめられなくなった
>>433 C++ではusingしなくても自動的にDisposeの働きをするデストラクタが呼ばれるからデストラクタでやれば問題ないです。
>>431 C++はブロックの先頭に変数宣言しなくてもいいんだよ。
>>431 繰り返すってどこ?
これもRAIIだけど何も問題ないよ。
void Reference(const Hoge& a);
void piyo()
{
Hoge b;
Reference(b);
shared_ptr<Hoge> c=make_shared<Hoge>();
Reference(*c);
}
437 :
433 :2009/12/30(水) 21:04:07
違うんだ!すまん。 class RAII; // ウィンドウと考える class Super { shared_ptr<RAII> window; public: Super(); ~Super(); public: void ShowWindow() { window = shared_ptr<RAII>(new RAII("RAIIだよ、RAII!")); window->Show(); } // 他のコード };
>>428 さらに、例外時にDisposeが呼ばれなかったときや、呼び忘れのときの動作も明確にすれば問題ないし。
Resource Acquisition Is Initializationですね。わかります。
これからはRAII + スマポの時代だな
人が増えてきたね。 盛り上がってきました
こんな感じ? 参照とスマポ おすすめ 素ポインタ ご遠慮願います。
汎用スマポは遅い
444 :
デフォルトの名無しさん :2009/12/30(水) 21:38:47
俺的には参照を使うのは構造体(データを表すものとしての)に使って、 クラスはポインタを使うってしてる。 クラスに参照を使うっていうのはNULLをつかわなければ最適解だけど、 class A; void Ref(A& obj); void AllowNull(A* obj); っていうのは、美しくない。
素のポインタを関数の引数にするっていうのはありだな。(オレは) でもオブジェクト生成する関数がスマポじゃなくて生ポインタで 返してくるっつうのは 逝ってヨシ
>>444 意味不明な分類法だね
構造体でNULL使いたいときとかクラスで参照先を保証したい場合どうするの?
>>446 クラスでオブジェクト保持ならスマポだろ
だいたい構造体でNULLとか、WindowsAPIかよ
NULLを使うとNULLかどうかのテストがプログラムのいたるところに必要になってプログラムが汚くなる。 だからNULLを使わないですむように参照を率先して使うように設計している。 そして共有する場合やNULLが必要な場合など、参照が使えない場合はスマポを使う。 ポインタを使うのはAPI呼ぶときぐらい。
そもそもNULLみたいな低レベルな概念が C++でクラスを設計するさいに本当に必要なのか。
>>449 検索の結果をイテレータで返す場合に見つからない場合はendを指すなどで表すからNULLは使わないね。
STLでも引数や戻りでNULLやポインタは使わないね。コンテナにshared_ptrを渡すときなんか参照とスマポがうまい具合に融合している。
弱参照の意味で生ポ使いたいときは結構あるとおもうんだが? weak_ptr使うにはshared_ptr使わないといけないし かといって共有目的もないのにshared_ptr使うのは無駄が多すぎる
shared_ptrはそんなに無駄は無いよ。shared_ptrを使い始めたとき同じことを悩んだけど、結局ほとんど無駄は無い上にわずらわしいリソース管理から開放 された上に確実に行えるメリットが大きいと判断したよ。 非共有だったとしても、コンテナに渡したりすると一時的に共有になる必要があったりするからとりあえずshared_ptrにしている。
だよなあ
454 :
412 :2009/12/30(水) 22:28:22
なんかすごい量のレスがw 聞きたいのですけど、参照渡しで渡されたクラスを基底クラスにキャストするときって、 どういう書き方をすればいいんですか?
weak_ptrって大発明じゃないか?
class A{}; class B{}; void f(B&b){ }
すまん途中で送信された。 class A{}; class B:public A{}; void f(B&b){ A&a = b; } だけの話じゃないの?
>>454 アップキャストはキャストは要らないですの。
class hoge :public base;のとき
void func(const hoge& a)
{
const base& b=a;
}
> 要らないですの KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE void func(const base& a); //... hoge a; func(a); //どうでもいいけどこれじゃだめなの?
> 問題無いですの KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
トークンはひとつに付き長さ32まで!
> KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE むしろこっちのほうがきもいですの
465 :
412 :2009/12/30(水) 22:43:02
あ、そうですね。 ありがとうございます。
466 :
デフォルトの名無しさん :2009/12/30(水) 23:12:00
良スレの予感
listのallocatorってひょっとして要素の確保にだけ有効で、ノード自体は普通の確保になるの?
要素に適応されたallocator型はノードにも使える様にrebindで適応される。
rebindってtemplate typedefがないから 苦肉の策で実装しました感が漂ってきてC++が嫌いになるぜw STL実装してて破綻してることに気付いただろうに何故規格に入れなかったのかと!
d rebindってそのためにあったのね
ぶった切ってすまんが、スレ的にはこの本はどうなのよ?
(
>>4 にない)
tp://www.oreilly.co.jp/books/4873110637/
tp://www.amazon.co.jp/dp/4873110637/
>>469 typedefさえもないが無いC#はどうよ。
>>469 C++標準化委員会は責任重大なんだよ!
そう簡単にじゃあ入れるか!ってことはできないんだよ。
>>473 Anders Hejlsberg が、
> typedef の問題は、一つの型が異なる名前を持つことだ。.NET では各型が単独の名前を持つようになっている。typedef を実現するには、全言語がサポートする必要があるが、もう遅い。
と言っている。
ほかの言語があまりまねをしないということは、C言語の問題点になってるんじゃねぇ?
for eachって.netだけなんですか? boost::foreach?を除く
>>476 何を言いたいの?他の言語にあるかってこと?
>>475 それって、「.netの問題で実装できません。許してお願い。」って言ってるように読めるね。
同じ数値に違う名前をつけるconstはあるのにね。
479 :
デフォルトの名無しさん :2009/12/31(木) 12:49:10
{ const int x = 1; const int y = 1; if(x == y) cout << "eq" << endl; } { typedef int x; typedef int y; if(typeid(x) == typeid(y)) cout << "eq" << endl; } 何か違いはあるのかね
デフォルト引数を使うべきか、オーバーロードを使うべきか どっち?
ケースバイケース
デフォルト値に値するものがなかったり 型が全て一緒でオーバーロードできず 関数名を変えなきゃいけないときもある つまりケースバイケース
現在自分はVC++2008を使ってC++の勉強をしているんですが、 C++では、入出力のprintf,scanfや、文字列char*、ファイル操作のfopenなどC由来のものを使うよりも、 入出力cin,coutや文字列string、ファイル操作のfstreamなどを使ったほうがはるかに便利だと思うんです。(scanfのエラーの多さや文字列char*の不便さなど。vectorとかもあるし) というわけで、C++ではこういったC関数は全く使わないのでしょうか? Cのソースをみても理解できるようになるから学んでおいたほうがいいよ、程度なのでしょうか。
構文解析器を作ろうと思ってます、正規表現のエンジンはboost1.40 を 使っているのですが、セパレータの字句に何を使えば良いのか、迷っています 素直に、XML で行った方がよいのとも思案しているのですがいかがなものでしょうか? 助言をお願いできないでしょうか。
人によるんじゃない 俺はiostreamをそれほど便利と思ったことはなく、C++でもscanf/printf系列を使ってる
>>485 サンクスです
車輪の再発明をしなくてすみそうです、ありがとう
flex はなんか、Javaのパーサのような印象を受けましたが、C++ からでも使えるのでしょうか?
>>483 詳しい仕様を知らなくても、何をするものか知っていて、それ以上を知る必要が
出てきた時にすぐ思いつきすぐ確かめられるだけの知識と情報ソースがあれば充分。
後の選別は経験がしてくれる。
>>483 クラスに対する入出力は演算子のオーバーロードが出来てiostreamは便利
逆に言うと単純な入出力だけならprintfやscanfで十分
でもstringの入出力はiostream必須だから使う人によるとしか言えない
printf、scanf を使わないでおくことはできても、知らずにいては、こまることも多いはずだ。
職業プログラマでC++を使っている方にお伺いしたいのですが、 職場でBoost禁止なんてことはあるのですか? 現実問題としてOSのAPIとC++標準ライブラリだけで プログラミングしろとか気が狂ってるとしか思えないんですが。
組み込みなら
>>491 VC6 の時代から、boost::tokenizer とか組込みで系の実装で使ってたよ。
職場でBoost禁止はそれなりに聞くね。まぁ少しずつ減ってるとは思うけど。 数年前までは、STL禁止なんて話も結構聞いたなぁ。今はどうなんだろう。 ちなみに、多くの場合は社内に独自ライブラリの蓄積があるので、 Boost禁止が即「OSのAPIとC++標準ライブラリだけ」に繋がるわけではないよ。
みなさんありがとうございます。 良かったです。 とりあえず珍しいコンパイラでboostが通らないとかは別とすれば、 正直 自社のライブラリがおkなら boostだっておkにしていい気がしますけどね。
素でstl 無しで、実装してくださいなんて言われた日には・・・・マンドクサイ
>>495 なんでいいと思うかわからん
boostに不具合あったらお前が責任取れるの?
素性の知れないものを使うリスクとか考えろよ
498 :
483 :2009/12/31(木) 16:34:52
皆様方ご返答ありがとうございます
>>486 ,
>>488 成程、人によりけりで深い知識を身につけていけばCの利便性が分かるということですね。
>>489 ヘッダファイルの問題ですか、自分はまだ速度やらメモリに気を遣うレベルに達してないのでその辺り盲点でした。
>>497 でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?
500 :
495 :2009/12/31(木) 16:47:13
>>497 確かに Boostも素性が知れないと言えば
しれませんしね。
ありがとうございます。
>>499 なりすまさないでください。
なんで、この板って「なりすまし」が多いんだろ? 勝手にレスされると腹立つわ
たいていそういうことするのって一人なんじゃね?
boostを使ったプログラム誰がメンテするんだよ、とか
C++系のスレではよくある話
>>499 は新参
社内ライブラリでも外部ライブラリでも結局メンテするのは担当者。
そして後で困る
まるで鎖国状態だな。
せっかくの既存ライブラリを使わないのももったいないし。 でも汎用性の高い外部ライブラリを直接使うから個人差で大変になるんだろうな。 社内ライブラリが外部ライブラリを参照するようにすれば、プログラマの個人差が無くなってよくなるんじゃね。
ぬるま湯に使ってるといざ外に放り出されたって時に死にそうだから 納期に間に合うあいだはboostは控えるべき 脳って使わないとどんどん衰えていくしね
>>508 いくら納期があっても、boost 使えば書けるコードを辛気臭く最初から作り込むのもなんだかなぁー
俺ならさっさと書いてしまって、ホワイトボックステストとかに注力するけどね、時間があればの話ですが。
>>499 はただの横槍じゃないかと思うが、
>>499 Boost使って問題が起きたら誰がその責任を取ってくれるのか。
社内のライブラリを使って問題があれば、会社として責任負ってくれるだろ。
C++ での開発に失敗したら C++WG が責任とってくれるに違いねえだよ。
外部ライブラリを使う人が品質評価をすればいいだけの話。 それに人員が割けなかったり、その能力のある人が皆無だというなら その職場がお寒い現状であるというだけ。
>>510 でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?
コピペ乙
まあ確かに、例えばWindowsとかの有料OSでも MSが動作を保証してくれていないのに、 なぜか俺らが保証するというおかしなことになっているんだよな。
cstdioにstd::tempfileっていう関数があるよ。
518 :
516 :2009/12/31(木) 22:20:53
>>517 それですと IO streamとして扱えないのです。
stringstream???
激烈なでっかいテキストデータを複数管理するのに、 どうしても複数のテンポラリファイルが欲しくなったのです。 まあ適当に一時ディレクトリ作ってそのなかで管理すればよいのですが。 すみません ありがとうございました。
MyClass hoge(〜); と スマポ<MyClass> hoge_p = new MyClass(〜); のどちらでも同じ仕事ができる場合、 大抵は前者を選ぶと思うのですが、 後者を選ぶ場合にはどんなものがあるのでしょうか? (関数からhoge_pを返すことはしません。) MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
コンストラクタを引数つきで呼べるとか
他のクラスのメンバ変数にしたときポインタなりスマポなら コンパイル依存性を減らせる可能性がある Effective C++ 第3版 31項 ファイル間のコンパイル依存性をなるべく小さくしよう
526 :
523 :2010/01/01(金) 00:15:52
みなさんありがとうございます。
>>524 前者も呼べますよね?
>>525 コンパイル依存性を減らすというのは考えていませんでした。
確かにそうですね。
あとは破棄するタイミング hogeを複数のオブジェクトが参照してるとき 後者のスマポがshared_ptrなら参照が0になるまで破棄されないので 破棄するタイミングを気にせずに複数のオブジェクトから使用できる 前者の場合、 hogeの生存期間 >= 複数のオブジェクトがhogeを参照する期間 を保障しないといけない
>>527 でも
> 関数からhoge_pを返すことはしません。
って書いてあるからそれは心配ないのでは?
あー、そうなるとスマポ使ってもあんまりメリット無いね
530 :
523 :2010/01/01(金) 13:56:39
みなさん ありがとうございます。 前者のMyClass hoge(〜);でスタックに確保できずに失敗する可能性と、 後者のスマポ<MyClass> hoge_p = new MyClass(〜);でヒープに確保できずに失敗する可能性と、 どっちを畏れるべきでしょうか?
>530 >MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか? 等おそれるべき理由がない限り、確保失敗の可能性など無視してオブジェクトの生存期間から決定する。 おそれるべき理由がある場合、どちらをおそれるべきかもはっきりするはずなのでそれに従う。
532 :
530 :2010/01/01(金) 20:06:56
>>531 としますと、例えば
void foo(const MyClass& str)
{
MyClass hoge(〜);
hoge.bar(str);
return;
}
これと
void foo(const MyClass& str)
{
スマポ<MyClass> hoge_p = new MyClass(〜);
hoge_p->bar(str);
return;
}
これは等価なコードとなりると思うのですが、
この場合はどちらでも良い、悪く言えばその場の気分次第ということなのでしょうか?
>>532 前者は、スタックを消費する。速い
後者は、ヒープを消費する。前者より少し遅い。
共有しないという前提(参照は可能)がある場合なら前者のほうがメリットがあると思う。
共有する場合は後者になるのかな。
等価なわけないだろ。 スマポ噛ませてる分処理は遅くなるしnewの速度コストなんてスタック配置の何千倍だから無駄。
>>530 スタックオーバーフローを恐れるような大きなオブジェクトじゃない場合はスタックに置いていいんじゃないか。
また、あまり大きいオブジェクトがあると、スタックフレームの増大で(E)BPからのオフセットが大きくなってプログラムサイズが若干大きくなる可能性があるね。たとえばスタックフレームを128バイト未満にするとかが目安かもね。
536 :
532 :2010/01/01(金) 21:46:44
>>533-535 ありがとうございます。
やはり巨大じゃないオブジェクトで意味的に等価なコードならスタックにおくべきという
ことなのですね。
ヘッダファイルって、そもそも何の為にあるんですか? 他の人が書いたコードを利用する時にヘッダファイルを見ると、 privateなメンバがわかってしまうのでカプセル化(人間から見た時)に なっていないような気がするのは気のせいでしょうか?
>>537 #define private public をするため
>>537 不用意に使うことを防ぐのが目的だから、見えてもかまわない。
JavaやC#だって、bytecodeやILを見たらわかってしまう。
Cだと、privateにあたるものは、長い名前をつけるという流儀もある。
>>537 privateは分からないようにするんじゃなくて、アクセスできなくして隠蔽するためのもの。
見えないわけでない。
543 :
デフォルトの名無しさん :2010/01/02(土) 00:20:00
>>539 「適当」ならいいじゃん
「不適切」とは意味が違うんだから
544 :
537 :2010/01/02(土) 00:40:03
>>540 ヘッダファイルはjavaだと、javadocのような存在なのではないのでしょうか?
javadocではprivateは見えないように設定されていますし
>>541 知らなかった、トンクス
>>542 頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
参考として、覚えておきたいので
>>544 javadocとはぜんぜん違うから
friendでprivateにアクセスできるクラスや関数を制限しているんだから、friend以外でprivateにアクセスできたら意味が無い。
方法としてはfriendクラスを経由するように設計すればいい。
privateに強引にアクセスする黒魔術なら
>>80 あたりに色々あるから
VC 208 Expressで . or -> やっても関数一覧が出ないでやんす!
548 :
デフォルトの名無しさん :2010/01/02(土) 03:50:14
ローマ帝国時代のVCか。
>544 Javadoc は人が見るためのもの、ヘッダファイルはコンパイラが解釈するためのものだ。 Java でも import すると(多分) class ファイルが解析されて、あるクラスにどんなメソッドがあるとか どんな例外が飛ぶとかを javac が認識する。 こういう情報がないとコンパイラはコードを生成できない。 C/C++ ではコンパイラが中間ファイルを解析するのではなく、ヘッダファイルを #include して ソース側にどんな関数がある等といった情報を取り込む形で対応している。 っつーかヘッダファイルがなくても自前で必要な情報を全部ソース直書きしてもいいんだけど いちいち書くのは面倒だからヘッダファイルを用意してあるといった方が正しいか。
適当なこといってんなワロス
>>547 STLやboostのヘッダ取り込んだら出てこなくなるから、あきらめるしかないね。
553 :
デフォルトの名無しさん :2010/01/02(土) 10:44:46
井の中の蛙じゃいかんぜよ
554 :
539 :2010/01/02(土) 11:01:06
>>544 > 頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
> 参考として、覚えておきたいので
privateメンバのことね?
ないよ。
>>80 の方法だって、未定義の動作だったり、
使える状況にかなり無理があるものだったりして
あまり現実的に好ましいものではない。
556 :
537 :2010/01/02(土) 11:11:33
privateへアクセスする黒魔術は勉強しておきます
#define private public
これの対抗手段としてPimplイディオムを使うわけだね
561 :
555 :2010/01/02(土) 11:49:41
>>556 やめろって言ってるだろ!
あれはタダの冗談であり、あんな未定義動作のクソコードを
実際に書く気か!?
Java出身なのかどうかしらないが、
カプセル化って知らないの?
#ifdef 千里眼 #define private public #endif
>>556 同じ魔法ならこっちにしろ ぴんぷるぱんぷるぱむぽっぷん
たしかに
>>80 が
黒魔術
というのは合ってる気がするw
邪悪で、未定義の動作という意味で。
537の人気に嫉妬
ワロスww #define private public #include <iostream> class Test { private: int x; public: void print() const { std::cout << x << std::endl; } }; int main() { Test x; x.x = 1; x.print(); }
#define class struct もあった方がいいな
>>567 だからそれはコンパイルエラーになることがあるからだめだろ
>>568 これなら問題ない
#include <iostream>
#define private public
#define class struct
class Test {
int x;
public:
void print() const {
std::cout << x << std::endl;
}
};
int main()
{
Test x;
x.x = 1;
x.print();
}
>>569 いや、俺が想定しているのは
template <class T>〜
ってところなんだけど。
>typename使え うぜーなこいつw
573 :
570 :2010/01/02(土) 19:43:27
C++で使えるパーサには flex, bison, Boost.Spirit 等など 色々あるみたいですが、 1. 習得しやすさ 2. 対応コンパイラの多さ 3. できることの広さ 4. 将来性 等を総合的に見て、どのパーサが一番良いのでしょうか? そのパーサを習得しようと思います。
Boost.Spirit!!
やめて!
flexはパーサーじゃなくてレキシカルアナライザー(トークン分割)
flex と bison じゃ、出来ること違うし。
spiritって禿しく遅いよね
メモリも超食うよね
誰がデブハゲだって?
>>574 とりあえず、二つに分けて LR と LL という方法がある。
yacc と ANTLR がそれぞれの方法の代表なので、それで調べてくれ。
どちらがいいかという話は、宗教論争になる。
いやいや宗教論争じゃないから処理時間オーダーの性質だとか適した言語パラダイムだとかいろいろ性質の違いがあるから。
>とりあえず、二つに分けて LR と LL という方法がある。 ここはいい。 >どちらがいいかという話は、宗教論争になる。 けど、ここはなんで?
585 :
574 :2010/01/03(日) 09:34:02
ありがとうございます。 flex + bison Spirit と分けるべきでしたか。 LL法とLR法ですが、現在ではLR法の方が主流という話も伺っています。
テンプレートについて質問です。 class Hoge{ int hoge(void); }; class Piyo{}; //↓多重継承したクラス class Fuga:public Hoge,public Piyo{ }; このようなクラスがあった時に void getPointer(void** v){return 何か;} template<typename T,typename B,int (B::*Func)(void)> int foo(){ T* t; getPointer(&t); //どこかからT型のポインタを取得。B型のポインタではまずい return (t->*Func)(); } int i = foo<Fuga,Hoge,&Fuga::hoge>();//Fuga->hoge()を呼び出させる こういうことをしたいのですが、現状では上記のようにFuga::hogeをテンプレート引数で渡そうとすると 内部的にHoge::hogeとして見られてしまい、結果的にもう一つHoge型を引数で渡さないと、そんなメンバ関数ポインタ無い!と コンパイラに怒られてしまいます。これをどうにかして foo<Fuga,&Fuga::hoge>() で呼び出したいのですが、何か手はありますでしょうか?
すみません。訂正です × void getPointer(void** v){return 何か;} ○ void getPointer(void** v){(*v) = 何か;}
発見した。 If the member is a nonstatic member of class C of type T, the type of the result is ``pointer to member of class C of type T. struct A { int i; }; struct B : A { }; ... &B::i ... // has type int A::* というわけで、テンプレートパラメータでは無理そう。 foo<Fuga,(int (Fuga::*)())&Fuga::hoge>() ;
答えになってないかもしれないけど、設計がすごく悪いように見える… テンプレートではなくクラスのポリモーフィズムで解決すべきじゃ? fooの内部で呼び出す関数名(Func)が固定と言うことは fooのテンプレート引数に渡されるクラスは全部Funcを持ってる前提なんだから HogeやFuga等に直接その名前(Func)で実装するべき Funcを持ってるクラスのポインタをgetPointer()が返せば getPointer()->Func()で済むのでfooは不要
現在C++をネットで勉強中です… s = fscanf(stdin, "%3[a-z]%*[a-z]%3[A-Z]%*[A-Z]%3[0-9]", x, y, z); この例では,配列 x,y,z が3文字までのため,4文字目以降の該当文字列を切り捨てる (次の配列に読み込まれない)ように %*[ ] で余分な文字列をスキップします。 ---- 上記のような *[ ]%の使い方に限らず、ググっても出てこないような 「え…そんなことできるのか」って方法はみなさんどうやって知りました? 市販の本を買えば当たり前な感じで書かれているんでしょうか、それとも探索中に行き当たりばったりで覚えるものでしょうか。
とりあえず10冊は読めばいいと思うよ。
それはC++じゃなくてCの頃の機能だからCの本読んだ方がいいよ
>>588 まさかとは思いましたが、やはりだめですか。
まぁ、キャストで行けるのはせめてもの救いですね・。ありがとうございました。
>>589 実は今やってるのはSquirrelというスクリプトにC++のクラスをバインディングするというもので
テンプレート引数には全く関係ないクラスが指定されるので、ポリモーフィズムでやるのは現実的ではないんです。
BCCじゃなければ素晴らしいバインダをそのまま使えるのに・・・orz
>>593 それならどちらにせよ綺麗には実装できないんだから
自分ならいっそマクロで書いちゃうかも
テンプレート引数が汚くなるのがなんか好きじゃないんだけど
みんなはそんなことないんだろうか
>>594 自分もこっからはマクロでやります。
ちょっと気になったんですが、マクロに複雑な型の記述を渡すと失敗するんですが、なんですかこれは
#define FUNC(name) name,#name
registFunction( FUNC(func<Hoge,&Hoge::hoge>) );
こんなんやるとマクロの引数の数が違うと出ちゃいます・・・
>>595 テンプレート引数のカンマが、マクロ引数のデリミタとして扱われてるんだろ。
BOOST_PP_COMMA( ) 使うとか。
やっぱマクロって廃止できねーよな−。 超便利だもん。
>>596 ありがとうございます。なんかboost使えないんでこんなの定義しました。
#define ORE_COMMA ,
いいのかなぁ・・・
ディスプレイに酒をぶっかけてしまった
動きました。マクロ展開のルールからすればとりあえずは合っていますが、問題ないのかなぁ・・・
>>601 > 動きました。
ならおk。
> マクロ展開のルールからすれば
そんなもん、従ってない環境が多すぎるから
とにかく目の前のもので動けばおkとするしかないと思うよ。
なるほど、その問題意識は持っておこうと思います。
javaだとinstance.hoge(String.class);で、クラスのインスタンス化を遅らせる事ができるけど C++はクラスのポインタを渡すしか、方法が無いんですか?
アブストラクトファクトリパターン
専ブラのコードを読んでいたら、_WIN32ってマクロが出てきました visual studioのマクロ(?)なのですが、他のコンパイラで_WIN32をコンパイルするとどうなるのですか? gccでちゃんとコンパイルができるのですが
>>606 _WIN32定義済みマクロは、Windows環境で定義される。でこうやって使う。
#ifdef _WIN32
Windows環境でしかコンパイルされないこと色々
#endif
608 :
606 :2010/01/04(月) 21:12:22
>>607 なるほど、他のOSだと_WIN32の所は無視されるわけですね
ちなみに、定義されていないマクロは全て無視されるのですか?
#ifdef HOGEHOGE
無視される?
#endif
609 :
デフォルトの名無しさん :2010/01/04(月) 21:25:43
>>608 > ちなみに、定義されていないマクロは全て無視されるのですか?
君の言っていることを文字通り解釈すると・・・
無視されるのではなくプリプロセスエラーになる。
つーかそんくらい自分でためせ。
HOGEHOGEが定義されていない状態で
/********************************************************/
#ifdef HOGEHOGE
コードA
#elif
コードB
#endif
/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/
コードB
/********************************************************/
となる。
コメントは残るの?
>>610 残らない。
・・・まあやっぱそういう指摘はしたくなっちゃうよなw
単に説明のため残しただけなのだ。
612 :
608 :2010/01/04(月) 22:30:56
コードB だった場合は コードA の部分は無かったものとして扱われる。 正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは になるんじゃないか!?
C++でクラスをヘッダに書くときってさ、 class ABC { int* object1; // int* int *object2; // int * public: // 以下略 }; どっちで書く?
ホワイトスペースは問答無用でなし
>>615 ポインタの宣言をどう書くかってこと?クラスとかヘッダとか関係なくね?
ポインタも型のうちのひとつととらえた方が理解が容易なので前者が好み。けして押し付けないけどね。 int* a, *b; みたいな書式は相容れないので使わない(えない)。 そもそもこの書式、コンマ区切りの式文?と衝突してしまうような。
最近はどっちとか聞く奴が殴りたおしたくなるくらい鬱陶しいので int*a; と空白をいれずに書いてる。
それなら int * a; と書いても良いのではないか?
まあ標準のヘッダみて真似するとかコンパイラにプロトタイプ出させてみるとか
>>620 それでもいいんだけど、
正直、行中の空白の有無で可読性なんて、個人的には殆ど変わらないので
キーボードを打つ回数少ない空白なしが好き。
placement new について教えてください。 newと同じようにdeleteしないとメモリリークの要因になりえますか?
二つで十分ですよ 分かってくださいよ
正確に言うと4つ。 RRとRLもあるよね。
ノー、ツーツーフォー
>>623 なるよ!。デストラクタ呼ぶのを忘れずにね
Boost.Spiritが一番いいんですかねぇ。 コンパイル時間が長いとかはまあ我慢できる範囲だとは思いますが、 コンパイラを選びまくりそうでどうにも気が引けてきます。 趣味で使っているコンパイラは通ると思いますが、 現在仕事で使っているあのコンパイラで通るのだろうか?・・・と考え始めると。。。
Boostのライブラリは、メジャーなコンパイラはほとんど網羅してるよ。 テンプレート周りの挙動が怪しい環境でもけっこう動く。 まあSpiritに限ってはなんともいえんがw
>>630 そうなんですか
テンプレートばりばりって聞いていたので、ちょっと不安でしたが。
試してみます。
ありがとうございます。
やるならSpirit v2じゃなくてclassicのほうにしといたほうがいいね。 v2はもう正式採用とはいえ、まだBetaという印象。
>>632 ありがとうございます。
既に最新のBoost入れてしまいましたが、もしかしてまだ残っていたり
しますか?
>>633 v1.6以前(classic)使ったコードは最新版でも問題なく通る。
(This header is deprecated. とwarningが出るが)
もう持ってるかもしれないがBoost本の「Boost C++ Librariesプログラミング」なんかも
v1.6時点でサンプル書かれてるから、勉強もしやすいと思う。
警告が気になる場合は、放置しても問題ないが
・メッセージに従ってincludeするヘッダを変更
・参照する名前空間をboost::spiritからboost::spirit::classicに変更
これでおk。
あ、俺はBoost厨だからSpirit薦めるけど、yaccとか他のツールは
触ってみた程度だから比較検討は自分でお願いします。
>>626 知らないな。
原理的にはLLとLRで十分だろ。
もしかして、他にTとかBもあるの?
spirit classicは字句解析を通さないからバックトラックする場合は遅いよ。 それでも正規表現よりは早いけど。
>>614 #elseじゃなくて#elifになってると言いたいのでは?
638 :
633 :2010/01/06(水) 00:34:09
>>634 ありがとうございます。
『Boost C++ Librariesプログラミング』は第2版を初めて購入し、
現在も持っております。
実は以前Boost.Spiritを使ったことがあるため
もう ろくに記憶にないとはいえ一番なじんでいるかもしれません。
>>636 ありがとうございます。
特定の組み込み系とかでどうしても必要な場合を除けば
速度より動くこと(確実さ・機能・可読性)を優先すべき
と(私の持論として)思っているので、正直速度はそこまでは気にしません。
639 :
609 :2010/01/06(水) 00:35:56
>>637 ああごめん、そういうことか。
まあその場合は
>>613 ではなくプリプロセスエラーになる。
が正解です。
>>637 多分
/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/
じゃなくて
/********************************************************
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
********************************************************/
こうだろって話かと。
>>623 配置deleteが何もしないなら
deleteを呼び出さなくても問題ない(行儀は悪い)
ただしデストラクタは呼び出す必要がある
>>623 placement new と言うと、標準ライブラリ <new> で宣言されてるやつのことを指したり、
そいつを含んで追加の引数を持つ operator new 全体を指したりして、話がよくわからない。
どっち?
void T::reconstruct() { this->~T(); new (this) T(); } で使う奴のことだろ。
644 :
623 :2010/01/06(水) 14:16:20
>>628 ありがとうございます。
やはりそうですよね。
>>641 なるほど。
>>642 標準ライブラリ <new> の方です。
皆様、ありがとうございました。
問題箇所と認識してコード修正します。
自作スマポ(参照カウント方式)を作っています。 循環参照の解決の機構を考えているのですが、 Pythonの方式よりも高速にできる方法を探しています。 いい方法はないでしょうか?
646 :
645 :2010/01/06(水) 18:09:52
template<class T> struct ptr_inner { T* refObject; int count; }; template<class T> class smart_ptr { ptr_inner* _inner; // 省略 };
647 :
645 :2010/01/06(水) 18:11:25
ptr_inner<T>でした。
C++を初歩から講義して頂けるスレってありませんか? 質問が出たら回答するタイプのスレではなくて 一方的に教えていただけるようなスレがありませんか?
何でも実況vipの実況vip大学スレで運がよければ講義してもらえるかもね
スレ立てれば?
へー、 参照カウントでも循環参照を解決できるんだ。 全然しらんかった。。。
> Pythonの方式よりも高速にできる方法を探しています。 そんなん見つかったらとっくにPythonが採用しているのではないかね。
MikePython
Pythonはメンドイから現在のを保守してるだけだろ
JPythonの出番ですけ
>>645 基本的に循環参照は設計で避けられるんだけど、それでも、Observerパターンのような場合は避けられない。
そんな場合でも、カウント式の循環参照の解決は弱い参照(weak_ptr)を使うのが簡単。
ところで、python方式ってどんなのなの?
スマポの設計は勉強になるからね。健闘を祈る。
>>652-653 最近、他の事だが教えていて思うのは「やる気があるので、一方的に教えても大丈夫」ってのと
「解らないところが判らないので、先回りして全部解るように教えてなくちゃいけない」って
パターンがある事を意識する回数が増えたな、と。
"Hello, World!"の説明で原稿用紙100枚は埋められるぜってのと、説明を三行書けないって
違いかと。
まぁ、でも、言語非特定で演習問題作成スレってのがあってもいいかな、と。
既存の演習問題集は非現実的な場面ばかりでツマランってのはあるし。
>>661 > "Hello, World!"の説明で原稿用紙100枚は埋められるぜ
俺はそんな変態 知らないぞ。
>>661 テンプレ作っていただけたらスレ立てします
>>661 ほんとに初心者をターゲットした内容のスレにしてくださいお願いします
聞かれてもいないのに親切丁寧に教えてくれるスレ
>>665 もうちょいセンスの良いスレタイでお願いします
理系クンが書くレスが理解し難いズレ
【C++】答えてくれ、頼む【++C】
【初心者向け】プログラミング演習問題【C++他】
【2ch】〜未踏プロジェクト〜【人柱】
おCえてください
>>669 これいいですね、これで立てたいです
あと
>>1 の内容も書いてください
C*-環
そもそも"Hello, World!"とはね、
Hello, Worldは韓国が起源です
【初心者】5分で覚えるこの一文【C++】
メルマガにありそうな名前だなw
>>662 真面目に説明すると奥深いぜ。
includeやその先のヘッダファイル、中に書かれているプリプロセッサの解説も出来るし、
coutで書かせてりゃ、クラスとオブジェクト(インスタンス)、静的クラスの説明まで引っ張れるし、
演算子定義も説明できる。
枚数余れば、"Hello, World!"がメモリのどの位置に置かれるかとか、他の書き方ではどう書けるか
とか、その際の式や文の意味の違いとかにも触れれるし。
あとは、コンパイルのやり方説明とかね。そこで、オプションやリンカにまで触れ始めたら、収集つかね
状態で原稿用紙100枚は埋まると思うのだが…
C++の教科書そんなに薄くありません。
プリプロセッサで100枚は書ける
原稿用紙100枚だぜ? 400×100だぞ? ・・・あ、いけるかもw
プリプロセッサとは、
>>678 おっとArgument Dependent Lookupを忘れてもらっちゃ困るな
スレタテまだー?
今まで書いたソースコードの量をイメージすると 40000字とか 簡単にいくな。 ソースコードが千行越えるとか良くある話。 それ以上は分割するけどさ。
改行やら何やらで、実質3万7千字とかそんな程度だろうからね。Shift_JISで74KB程度。 そう考えるとチョロいが・・・自然言語を書くのって疲れるからなぁ。
『ふう、ここまで書いてようやくwc換算で10000文字か。先はまだまだ長いな。』 とか間に挟んじゃうな。俺だったら。
688 :
デフォルトの名無しさん :2010/01/07(木) 08:30:27
>>660 Pythonのってあれだろ、マーキングするやつ
include stdio.hみたいなコードってどんな時に使うのでしょうか?
何を言っているのかわかりません。
1ファイルに3万行のソースコードが俺のジャスティス わざわざ分かれていたのをまとめたんだ
692 :
645 ◆GWRSHcLrd6 :2010/01/07(木) 17:28:42
>>692 スマートポインタならModern C++ Designの7章読んだか?
あとはboost::shared_ptrのリファレンスと実装を眺めるのも有用
694 :
645 ◆GWRSHcLrd6 :2010/01/07(木) 18:46:10
>>693 shared_ptrの実装なら眺めたことがあります。
Modern C++ Design ですか。
よく聞くんですけど、読んだことがなかったので
読んでみようと思います。
>>692 すいません、作って欲しいソフトがあるのですが依頼はダメですか?
構いませんが、そんな大したことはできませんよ(;一_一) まあ、ものによります…
ありがとうございます もし公開するときにHPにアフィリエイトがありましたら一週間程度は踏ませていただきますので宜しくお願いします ソフトの画面の中にランダムに点を表示して、それを制限時間内に何回クリックできるかってソフト作れませんか?
わかりました。 いつ公開できるかわかりませんが、できたときにはここで通知しますので よろしくお願いします。
こちらこそ無理を言って申し訳ありません 645先生と呼ばせていただきます ありがとうございます
あ、OSとかは??
WindowsかLinuxならどちらでもOK マルチプラットフォームなら最高です
ミス ありがとうございます WindowsかLinuxならどちらでもOKです マルチプラットフォームなら最高です
じゃあすまないんですけど、windowsの方がよく触るのでWindowsで ^^; windowsだとするとXP以上の対応でいいですか?それによってGDI+を使うか どうかを考えますので・・・
他でやってくれ
ですよね。
ゲ制作板にでもいけば1時間で作ってくれるよ 作る奴が居ればだが
>>691 >わざわざ分かれていたのをまとめたんだ
やめろよw
>692-703 どっかいけよ
645先生のやる気をそぐような言動は慎めよ!
>>703 windowsで大丈夫です。
宜しくお願い致します
うぜぇ
>>709 何が先生だwww
いいからどっか消えろ失せろ
スレタイ読め
な.../ :::早:::::l::::":::::::、:::: :ヽ.::::::::::::::::.:::::.こ:.: 駄. ん/ :::::::く::::::|::::::::::::::ヽ:::::ヽ`:、:::::::::::::::::い::: 目 と.!:::、::::.:::::::::.l:.:::::::::::::::ヽ::\:::ヽ.::::::::::..つ:. ..だ か:..: :::|,::: :: :、丶: ヽ: :: :ヽ :::'-::ヽ:::::::::..・ .. し::::|:::::::y::::::::ヽ:::::ゝ:ヽ,::::::\.::::゙''.::ヽ::::::・: . な:,:::.l:::::lヽ::::::::、:":::::、: 、:::::::゙'.l'-、::.:l::::・::.: . い.!:,::::ミ、:゙!,ヽ::::: l::::.\ヽ,\::..,.\\.l::.::::: ... と.! l::.:::、::::l从_:::::l::,,'.:/_、ニ,,__、i::|:、''"!:::::::, . .・:::.ゝ. !./゙! :^lゝ\|::l ゞ='ハ":`.,!`)l:'":::::":::/ .. .・::ヘ::: `''`:ゝ-:"::::::::ソ":.、:´ `-'‐' ι,.|,i::i'::::/.. .・. ::ミ `:::::::::::::::::::::::: ノ.|.l::::i./ ... . ヽ''l、::::::::::::::::::: .i .,l/::::|:,i" .'ル:::::::::::::::::ゝ_- U,..l,i|::l/:. . . ヽ:::::::: ゙'/ゞ.从、.! ... . ヽ::::::`ヽ..二"''‐ / ,i゙.::|"l/‐ . /゙:、::: `― ./,,、/ .゙| ! ...... / .ヽ: \ _/ / l./ ゙ . , / l ヽ .`'― :(,゙/゙ //
>>714 ぶつかってたら別れてても普通コンパイルできなくないか?
>>716 static foo() とかよく使いませんか?
派生クラス全部について自動変数を作れなく、かつnewできるようにする方法ってありますか?
俺はクラスのテストのことなら他のヘッダなりcppなりに書きまくる。
>>719 自動変数を作れなくする方法はあるが、派生クラスを全部で禁止する方法は無さげ。
てかそんな必要があるのかを考えたほうがよくね?
>>714 そうでもなくないか?
だってもともとリンクしてぶつからないわけだろう?
さらに名前空間をちゃんと分けていれば
結構どうにかなると・・・思う。
>>724 だからどうでも良いって言ってるだろ
さっさと失せろ低能
>>722 侵入型参照カウンタをベースにしようと考えてます
そうすると自動変数でreleaseメンバーを封印するか、自動変数を封印するかしないとダメだとおもうので必要性はあるかと
>>727 やっぱり必要ないような。
「〜を封印」しないと、どんな問題が起こるのを心配してるの?
自動変数にreleaseしてdeleteしてしまうかもしれないので危険じゃないかなーと
>>729 それって、 int a; delete &a; してしまうかもしれないので危険だ、と言うのと同じじゃない?
気にしてもしょうがないような。
とりあえず release() は private にしといて、専用の関数を friend で指定しとくのがいいと
思う。それで十分だとも思う。
731 :
デフォルトの名無しさん :2010/01/08(金) 11:00:23
vector<Node*> a; vector<Node*> b; aとbの配列があってその中から共通のNode*だけを取り出したいのですが どうすればいいでしょうか
732 :
デフォルトの名無しさん :2010/01/08(金) 11:17:15
わかったからもう良いです。
両方sortしておいてset_intersection
テンプレートクラスの中のテンプレート関数は 宣言と実装を別にするとコンパイルは通らないものなんでしょうか。 template<class T> struct hoge { template<class U> void abc(U* obj); }; template<class T, class U> hoge<U> hoge<T>::abc() { return hoge<U>(); } エラーが出ます。
735 :
645 ◆GWRSHcLrd6 :2010/01/08(金) 18:42:41
error C2244: 'hoge<T>::abc' : 関数の定義を既存の宣言と合致させることができませんでした。 定義 'hoge<U> hoge<T>::abc()' 既存の宣言 'hoge<U> hoge<T>::abc()'
736 :
質問 :2010/01/08(金) 18:47:54
C++用の画像ライブラリで、静的リンクしてもソースコード公開義務が発生しなくて、 いろんな画像形式に対応していて、 画像を拡大したり縮小したりフィルタをかけたりする事ができるもので もっともメジャーなものって何でしょうか?
737 :
645 ◆GWRSHcLrd6 :2010/01/08(金) 18:49:46
template<class T> struct hoge { template<class U> void abc(U* obj); }; ではなく template<class T> struct hoge { template<class U> hoge<U> abc(); }; でした。
>>734 template<class T> template<class U> hoge<U> hoge<T>::abc()
{
return hoge<U>();
};
>>736 OpenCVとかじゃね? 確かBSDライセンス
何が一番メジャーかって言われると俺もわからん
DxLib使えよカス
>>744 いや、常識で判断しろよ。
それをこのスレできくのか?
746 :
645 ◆GWRSHcLrd6 :2010/01/08(金) 20:25:36
できました。ありがとうございます。
>>745 すいませんでした
他のスレに言ってきます
よし、二度と来るなよ
750 :
747 :2010/01/08(金) 21:06:43
ハ,,ハ ( ゚ω゚ ) お断りします / \ ハ,,ハ お断りします ((⊂ ) ノ\つ))( ゚ω゚ ) (_⌒ヽ((⊂ノ ヽつ )) ヽ ヘ } (_⌒ヽ ε≡Ξ ノノ `J ノノ `J
ここまで俺の自演
二次元の敗北、三次元の逆襲
まあ、2つのことを同時にやろうとして わけが分からなくなることは初心者にはありがちだな。
>740 単体では「色々な画像形式に対応していて」を満たさないと思うが GIL がある。
759 :
722 :2010/01/09(土) 11:22:03
>>727 スマポの研究者の方だったんですね。なら、話は限定される。
自動変数を禁止するには、デストラクタをprivateあるいはprotectedにするだけで十分です。でも、派生させるとデフォルトデストラクタがpublicになって保護できないので不完全。
自動変数禁止の目的は自動変数をスマポに代入するミスの保護だと思うけど、&オペレータをprivateにすれば自動変数をスマポに代入できなくるので保護できる。自動変数は速いので禁止するのはもったいないです。
うんこ
>>759 僕じゃないです ^^;
でもとても参考になりました。
762 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 17:14:38
>>762 > class _null {};
> struct __ptr;
予約識別子。未定義動作。
適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。
ファイル終端に改行が無い。未定義動作。
smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
しかもそこで投げるのは bad_alloc じゃないだろう。
bad_alloc だとすれば #include するヘッダが間違ってる。 <new> が正解。
smart_ptr<T>::Reset() では強い例外保証がほしいところ。
shared_ptrとはどう違うの?
765 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 20:26:59
>>763 >> class _null {};
>> struct __ptr;
>予約識別子。未定義動作。
そうでした・・・
>適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。
すみません。<cstdio>をインクルードしました。
>ファイル終端に改行が無い。未定義動作。
開いてませんでした・・・orz
>smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
修正しました。ありがとうございます。
>しかもそこで投げるのは bad_alloc じゃないだろう。
そうですね… とりあえずoverflow_errorに変更しました。
766 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 20:28:57
>>764 重要なのは、使ってるだけでは気づかないスマポ実装のノウハウが学べられことかな。
>>762 キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。
こんな使い型の落とし穴があるよ。
Hoge* p=new Hoge();
smart_ptr<Hoge> a=p;
delete p;
暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
explicitにする必要あり。そうするとこういう書き方しかできなくなる。
smart_ptr<hoge> a(new Hoge());
a=a;
参照カウントが減って開放されてしまう。
>>765 32bit環境下ではINT_MAXを超えるのは不可能だからチェックは要らなくない気がする。
64bit環境ではlong longにすれば同様になると
>>765 NULL 使うためだけに cstdio とか、アホか。
0 にしとけ。どうしても NULL が使いたいならせめて cstddef で済ませとけ。
どうせなら、NULLはc++0xで標準になるnullptrにしようよ。 nullptrでググると現在のコンパイラでも使える定義が出てくるよ。
772 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 20:46:48
>>767 >キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。
一応カウントは共有しているのですが…
キャストはユーザー?(開発者)に任せた方がよいのですかね。
>参照カウントが減って開放されてしまう。
本当ですか!?そこまで気付かなかった…
>暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
やっぱりそうですか。shared_ptrを使っていて不便に思っていたもので… やはりミスの要因になりかねませんよね。
>>769 > 32bit環境下ではINT_MAXを超えるのは不可能
Windows 限定なら、ってこと?
そうじゃなければアドレス空間 32bit で int が 16bit とか、 int は 32bit だけど
アドレス空間はもっとあるとか、不可能とは言い切れないと思うんだけど。
カウンタを uintptr_t にしとけば確実かな?
>>772 inner_ptrを共有すれば問題無い。
キャストは必要なので用意したほうがいい。
775 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 20:54:37
>>768 すいません、書き忘れました。
例外保証についても修正しなければなりませんね…
>>773 uintptr_tですか。置き換えておきます。
776 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 20:57:04
>>770 置き換えておきます。
>>774 inner_ptrを共有すると、仕組みが複雑になってしまうので…
uintptr_tの最大値ってマクロ定義されてるっけ?
>>777 numeric_limits を使えば問題ない。
でも、ここでは最大値のチェックを不要とするために uintptr_t を使うって話だから、
あんまり関係ないかも。
あれ? uintptr_t って C++ 2003 に入ってたっけ?
779 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 21:17:28
>>770 #ifndef NULL 〜 #define NULL 0 にしました。
>>778 メモリの制約、ということで、オーバーフローチェックは省きました。
>>776 inner_ptrの共有のほうがメリットがあるので、気が向いたときにでも検討してね。
>>779 > #ifndef NULL 〜 #define NULL 0 にしました。
なんでそういうことしちゃうかなー。
>>770 の2行目をもう一度読み直して欲しい。
いや、ここはnullptrでよろしく
783 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 21:38:55
わかりました。可読性を上げようかと思ったのですが、 変えてみてもそんなに変わらないし、cstddefをインクルードするほどではないので 0で置き換えます。
C++でNULLって使わなくね? 完全には無理だがほとんど空ポ自体使わないように設計できるし、使ったとしてもやっぱ0だよ
785 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 21:44:02
>>780 どのようなメリットがあるのか教えていただけると幸いです。
というより内部のデータはどう扱えばいいのでしょうか?
テンプレートクラス内部なので…
Deleterを実装すれば簡単なのですが。
786 :
デフォルトの名無しさん :2010/01/09(土) 21:45:17
スマポを作るのに空ポがいらない設計があるなら教えてほしいものだ
いや、実体は shared_ptr だけどヌルを許容しない shared_ref とかいうやつがあれば、 意外と有用かもしれない。
1. #define NULL または #include <cstddef>する 2. 0 3. やっぱり #ifndef _HAS_CPP_0X #define nullptr 0 #endif
>>786 bool is_null;
ってメンバをチェックするようにすればいい。
790 :
デフォルトの名無しさん :2010/01/09(土) 21:57:39
>>785 internal_ptrがとcountが別々だとアロケートやコピーにコストがかかっちゃうし。
オブジェクトを掴むinternal_ptrが複数あると将来的に管理が面倒になりそう。1オブジェクト1internal_ptrの方が簡単になりそう。
>>787 shared_ref<hoge> r1(param1,param2,...); //初期化が必須
shared_ref<hoge> r2=r1; //ok
shared_ptr<hoge> p;
p=r; //ok
r=p; //だめ
こんな感じか?。これなら意味があるね。
793 :
645 ◆xj5aoi8gEM :2010/01/09(土) 22:08:02
>>791 なるほど、Deleterが実装できた場合は置き換えたいとおもいます。
>>788 ・・・どうすれば??
>>793 ああ、そうかinternal_ptrがクラステンプレート内のクラスだからキャスト時にアクセスできなくなるからか。
外に出せば簡単になるけど、隠したいなら名前空間detailの中に隠すとか
795 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 22:16:43
あ、ハンドルのところに文字打ってたw
796 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 22:18:38
ハンドルじゃなくてトリップだった・・・
797 :
645 ◆GWRSHcLrd6 :2010/01/09(土) 22:25:38
>>788 #define NULL はねーよ。
標準ライブラリ実装の定義とずれたら ODR 違反になってしまう。
流石に#ifndefとかするんじゃないか?
3は #ifndef _HAS_CPP_0X #define nullptr reinterpret_cast<void*>(0) #endif じゃない?
>>801 C++では0はぬるぽも表すから問題ない。
803 :
798 :2010/01/10(日) 00:00:29
そうだな。疲れてるようだ
>>793 innerの共有なんて、smart_ptrがinnerとオブジェクトへのポインタを保持して、
internal_ptr内部はカウンタのみにすればいいだけ。
あと、メモリリークする。次のコードではnewがdeleteより常に1回多く呼ばれることが分かる。
よくよく追っかけると、ptr_cast内でnewしたinternal_ptrがdeleteされていない。
なお、コメントアウトを外してpb.Free()を行うと、代わりにpbのinternal_ptrがdeleteされなくなる。
あと、ptr_cast<base>(pd)と書かせる意図だろうけど、それにはtemplate<class U, class T>のTとUが逆。
#include <iostream>
#include <new>
#include <cstdlib>
#include "smart_ptr.hpp"
void* operator new(std::size_t n) throw() {
void* p = std::malloc(n);
std::cout << "operator new: " << p << std::endl;
return p;
}
void operator delete(void* p) throw() {
std::cout << "operator delete: " << p << std::endl;
std::free(p);
}
struct foo {virtual ~foo() {std::cout << "~foo" << std::endl;}};
struct bar : foo {virtual ~bar() {std::cout << "~bar" << std::endl;}};
int main() {
smart_ptr<bar> pb(new bar);
smart_ptr<foo> pf = ptr_cast<bar, foo>(pb);
//pb.Free();
}
コンパイラについての質問をしていいか分からないんですが、 Cygwinスレの勢いがなく返答が帰ってくる信用性が低いのでこちらで聞きます。 (急いでいるので) Bisonのコマンドを使うためにcygwinのインストーラ(名前はsetup.exe)を起動して Devetの項目のBisonだけを選択してインストールしたところ 途中でエラーが出て止まってキャンセル押したらCygwinが起動すらしなくなりました。 今PCに入っているCygwinに追加する物も既にあるものも同時に入れないとだめですか? 追加インストールでなく再インストール扱いになっていたんでしょうか?
Bisonってなに?
四天王のひとり。ステージはラスベガス。
もしくは海外版のボス
信用性がどうたらと書かれてほいほい答える奴もそういない
>>808 リュウの場合はしゃがんで中キックで牽制。
足を当ててもいいけど、メインは牽制で近づけないようにする。
で、飛んできたらそのまま大パンチでアッパー。
ノー駄目で倒せます。
C++を覚えたらオンラインゲームのエミュレータサーバ?は作れるのでしょうか?
もっと他に覚えなきゃいけないことがいっぱいあるぞ 少なくともネットワークプログラミングを覚えなければ
スマポまだー? (AA略
慌てない慌てない 一休み一休み
>>805 >innerの共有なんて、smart_ptrがinnerとオブジェクトへのポインタを保持して、
>internal_ptr内部はカウンタのみにすればいいだけ。
スマポのサイズが大きくなるだろ。
普通のポインタサイズを超えるとか・・・
818 :
デフォルトの名無しさん :2010/01/10(日) 20:49:39
使い物にならない、って言いたいんでしょ!
819 :
デフォルトの名無しさん :2010/01/10(日) 22:19:42
なんでboost::shared_ptrじゃダメなの? どうしても限界まで速度を上げたければ生ポインタを使えば良いし そうじゃないならboost::shared_ptrじゃダメなの?
誰も駄目とは言ってなくね?
STLとかboostはDLLでうまく扱えないから困る
具体的にどんな問題?
823 :
645 ◆GWRSHcLrd6 :2010/01/10(日) 22:47:10
今、一から書き直しています。 少々お待ち下さい・・・
824 :
819 :2010/01/10(日) 22:49:53
>>820 確かに言ってないな。
つまり車輪の再発明をしたいってこと?
(注:俺は車輪の再発明を全面的に否定的したいわけじゃありません。)
>>821 えーっと、クロスDLL問題のことか?
いずれにせよ
>>821 が想定しているDLLでの問題ってのを解決できる
フリーなスマポは現在配布されているの??
基礎を知らずして応用はできないからね。基礎技術を見つめなおすのはいいことだと思うよ。再発明大いに結構。
826 :
デフォルトの名無しさん :2010/01/10(日) 23:24:44
発明と履修を混同する奴って痛いよね
答えのある問題の方が勉強に向いてるからな スマートポインタの実装は学べるところが多いしね
828 :
645 ◆GWRSHcLrd6 :2010/01/11(月) 00:14:28
動的削除子まで つけてんのか。 さすがスマポ
活発に手を動かすな奴が居ると好いな
boostの削除子の関数ポインタでもファンクタでもどっちでもおkなやつってどうやってるんだろう
単に削除子の型がテンプレートパラメータになってるだけだ。 STLでも普通に使われているはずだが。
>>828 動的削除子がついて本格的になりましたね。
動的削除子を関数オブジェクトにすると少し速くなるかも。でもヒープの処理時間に比べればわずかかも。
それよりも、deleter_baseとinternal_ptrを統合すればnewの回数が減らせて速くなりそうだね。
ただの関数だったらわかるんだけど・・・ 削除子を保存しないといけない場合が分からない void hoge1(void); struct hoge2 { void operator () (void); }; template <class T_hoge> void foo(T_hoge hoge) { hoge(); } foo(hoge1); foo(hoge2()); template <class T_hoge> struct bar { T_hoge m_hoge; bar(T_hoge hoge) : m_hoge(hoge) {} }; × bar b1(hoge1); × bar b2(hoge2()); ◯ bar<hoge1> b1(hoge1); ◯ bar<hoge2> b2(hoge2()); 型宣言の時にテンプレートパラメータを消去する方法が思いつかない
>>834 型消去という手法がある。これで任意の関数オブジェクトを保持できる。
class TypeHolderBase
{
public:
virtual void func1(void* mem)=0;
};
template<class T>
class TypeHolder :public TypeHolderBase
{
T f;
public:
TypeHolder(const T ff)
:f(ff)
{
}
virtual void func1(void* mem)
{
f(mem);
}
};
後はこれをTypeHolderBaseで管理すればいい。
836 :
645 ◆GWRSHcLrd6 :2010/01/11(月) 10:32:38
お前らそれなんに使うんだ?
>836 そういやboost::anyはチェックしてみた?あっちの方が実装が簡単で参考になるよ。 boost::anyは値で保持しているから、カウンタは自分で実装する必要があるけど。
>>836 deleter_baseが派生によって任意の動的削除子を掴む設計の様ですね。
で、さらにそのdeleter_baseをinternal_ptrが掴むようになってるので、どうせなら、internal_ptrがdeleter_base
と同じ手法で直接動的削除子をつかめるようにしたらnewが一回減るかなとか。
アロケータとかスレッド対応もやってよね
アロケータ?
>>835 勉強になったっす
TypeEraserパネェっす
843 :
デフォルトの名無しさん :2010/01/11(月) 20:06:20
下記の様にifstreamではインスタンス化の際に2種類の方法がありますが、なぜnewしなくてもインスタンス化できるのでしょうか。 ifstream* in; in = new ifstream("filename"); ifstream in("filename");
intにも下記の様に2種類のインスタンス化の方法があるぞ int *x; x = new int(100); int x(100);
845 :
デフォルトの名無しさん :2010/01/11(月) 20:25:33
>>844 CLIのマネージドクラス??ちょっとよくわからないです。
しかし、何となく理由はわかりました。
静的割り当てと動的割り当ての違いですね。
> CLIのマネージドクラス??ちょっとよくわからないです。 いや、ごく普通のC++だが・・・ そういう書き方もできるんだ 変数宣言と初期化の構文にintもifstreamも違いは無い
スタックへの割り当てとヒープへの割り当ての区別が付かない人が多すぎるよね…
忘れた頃にやってくるよねこの手の質問は。 スタック、ヒープとフリーストアの違いは知っておかないと大変なことになるからな。
849 :
デフォルトの名無しさん :2010/01/11(月) 21:02:11
>>847 ほぅほぅそういう違いがあるんですね。
ちょっと勉強してきます。
851 :
デフォルトの名無しさん :2010/01/11(月) 21:04:13
>>846 intもクラスなんですね・・
cの頃と同じ型?かと思ってた
>>851 そういう問題ではない
>>843 が理解できてないのはC++以前のC言語レベルの話
int x[100];
と
int* x = (int*)malloc(sizeof(int)*100)
の違いがわからないと言っているのと同じ
853 :
デフォルトの名無しさん :2010/01/11(月) 21:22:00
>>852 その違いの話は既に解決しました。
ただ、intがクラスだった事を知らなかったので。
昨日からc++の勉強を始めたので解らない事ばかりです。
>>853 int はクラスじゃないよ。
new を使うかどうか、使えるかどうか、使わないといけないのかどうかは
クラスかどうかとはあんまり関係ないよ。
856 :
デフォルトの名無しさん :2010/01/11(月) 21:28:03
>>855 int(100); 見たいな宣言の方法はコンストラクタを呼んでいるんじゃないんですか??
857 :
デフォルトの名無しさん :2010/01/11(月) 21:30:55
>>856 間違えました
int x(100);のことです
>>853 newはクラスにしか使えないって考え方が間違ってる
intはクラスではないがnewの構文がプリミティブ型にも使えるだけの話
極論すればmallocが構造体の確保だけに使うわけではないのと同じ
newされるのがクラスであればコンストラクタである関数が呼ばれるが
そもそもコンストラクタとは「初期化するもの」なんだから
プリミティブ型が同じ構文で単に初期化されるのは至極真っ当でしょ
859 :
デフォルトの名無しさん :2010/01/11(月) 21:47:49
>>858 newの話とクラスの話は別です。既に前者の話は解決しました。
ただcではint x(100);の様な書き方をした事が無くc++のコンストラクタによる初期化と同じ書式なので
intがクラスなのかと思っただけですよ。
boostのスマートポインタを使ったことなんですが、 次のようなソースで警告とか出ますか? sptr<int> ptr1( new int(10) ); const sptr<int> ptr2( ptr1 ); sptr<int> ptr3( ptr2 ); *ptr3 = 20;
試せよ
もっともですね・・。 試してみます。
そういえば、Boostを含むいくつかのスマポを除く、たいていのスマポはSTLと相性が悪いって聞くんだけど、本当? そういう話聞くから、スマポ使うかどうか迷ってるんだけども・・・。
>>863 std::auto_ptr は Assignable 要件を満たさないので、 Assignable を要求するライブラリ、
主に標準コンテナと組み合わせて使えない。
boost が使えるなら boost::shared_ptr にしとけば(いくらかの実行効率は除いて)問題ない。
うっかりコンテナと組み合わせたりしなけりゃ std::auto_ptr も十分使える。
とりあえず delete を自分で書いてるようなら今すぐ置き換えてまわることをおすすめする。
>>863 スマポの仕様による。
スピード最優先だったりするスマポの場合はSTLに入れられなかったり。
でもスマポを作る人がSTLに入れられる様に作りたいと思っていればそうなっているだろう。
公開テンプラメンバー関数ってクライアントのほうで特殊化してカプセル化が崩せるように思えるんですが、これをできなくするテクニックとか在りますか? クライアントの良心を信じるほかないのでしょうか?
そういった使い方は動作保証しません、サポートもしません、って言って(書いて)おけばいいんじゃね 自己責任でやってくれるぶんには別に困らないだろ 何か問題が起きても動作保証外ですで突き返す
自分はもの覚えいいほうだと思うのですがどれくらいでC++って基本マスターできますか? ちなみにまだ小学5年ですが、授業時間の話だけで毎回100点とか90点くらいはとります
どれくらいっていうのは何でしょう? どれくらい学習時間かければマスターできるかってことでしょうか? どれくらい物覚えがよければマスターできるかってことでしょうか? どれくらいのレベルの学校に行けばマスターできるかってことでしょうか? 聞きたいことをもうちょっと詳しく
集中して勉強すれば数週間〜数ヶ月くらいじゃないかな 他のプログラミング言語の経験にもよる でも学校の勉強はおそろかにしちゃいけない
C++なんて別に難しくもなんともないから2時間ぐらいで覚えられるだろ。 Helloworld、分岐、繰り返し、関数、ポインタ、クラス、継承 はい終了
templateもSTLもやらないつもりか そんなだからいつまでも「わかったつもり」なんだ
haskellを使いこなせてはじめてC++が分かる。 haskellをやりなさい。
>>872 そんなもの全部ライブラリ扱い。
必要なライブラリはそのつど覚えるもんだよw
うゆの臭いがする
template metaprogrammingはやらないつもりか?
templateもSTLも昔のC++にはなかったんだから、それを知らなかったらC++を知らないとはいえないだろ。 おいおい、覚えていくことになるだろうが。
素直にC++98以降はやらないって言おうな
templateなんて所詮はポリモルフィズムだろ 関数型言語だと割と普通だから必要に迫られなければやらなくてもいい。
まぁ、最低限のことだけで十分だと思うよ。 テンプレートとかややこしくなるだけで百害あって一利なし。 テンプレート使うぐらいなら似たような関数を大量生産するね、俺なら。
>>879 まったく違う。静的か動的かが。
テンプレートなんぞマクロみたいなもん。
些細な違いを持ち出して、大きな違いだと宣伝するのはセミナー屋だけにしてくれw マジで洗脳されるのもたいがいにしてくれw
やっぱりうゆ臭がする しかしそれを見越した釣りの可能性も
テンプレートなんぞ複製が作られてるだけやん。ジェネリックプログラミングやん。 ポリモーフィズムは動的に決定されるやん。OOPやん。
templateってSTLとか見れば便利だって理解できるんだけど 実際に自分が使う場合、何処で使って良いのかわからんのよね
テンプレート?ああライブラリ書き用ね。
学習にどれくらいの期間がかかるかなんて問題は個人差が大きすぎる
STLはライブラリだけどtemplateは言語仕様だろ
Zip(Deflate64) がロードできるライブラリでロード速いやつありますか
891 :
デフォルトの名無しさん :2010/01/12(火) 19:21:12
>>868 当たり前
実は今は小学生のテストで90点取れないやつの方が少ないんだぜ
私立は知らんけど
俺も小学生のときはテスト勉強なんて一度もしたこと無かったけど、 90〜100は当たり前だった。
俺100点どころか小学校在学中に九九覚えきれなかったわ 高校物理は全国10位前後だったけど
俺も高校物理は全国1位になったことあるぞ 満点だからw
っていうか、高校の数学や物理の問題ごときで間違えるようならC++プログラマ向いてないんじゃね。
百点がでるテストは欠陥テスト
いつも99点で止めてた俺は資格を持っていない
物理で満点とれる奴ってどういう脳ミソしてるんだか
物理って高校物理? ニュートン力学とか? もうわすれちった。
知っているのにわざと間違える65点の人が好き
モル計算大っ嫌い
モルあったw なつかしすw モルだけはサッパリ概念がつかめなかったのを思い出すw
数学より物理が得意だったなぁ。 数学は統計が苦手だった。
まてよ モルは物理じゃねーぞ
モルがわからんとか、どんだけ低学歴なんだよw
>>906 ____
/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴|
|∵∵/ ○ \|
|∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄
|∵ | __|__ | < うるせー馬鹿!
\| \_/ / \_____
\____/
virtual関数って気になるほどのオーバーヘッドなんですかね? 内部ポインタにvirtualを導入したいのですが。
実測して気にならないぐらいのコストなら気にしない
>>906 使わないと忘れちゃうよ。科目の好き嫌いも影響するしね。
日本って得意分野を持たず平均して優秀な人間を優遇する社会構造になってるじゃん。 好きなことはすごく良くできるけど、嫌いなことはからっきしダメっていう人間は日本では負け組みになってしまうんだよ。
学問として成り立ってる分野では(ITもとっくにそう) そういう人間のなかでできるやつを選別して大学の研究室に残らせたり企業の研究所に送ったりするので 実際はその競争にすら負けた出来そこないが宙ぶらりんになってるだけだけどな
計算機科学やソフトウェア工学(爆笑)はまだまだ学問として認められていないよ。
まぁその選別作業がすごく上手く行ってて、変なのを送ったり 有能なのを送らなかったりする「紛れ」が少ないなら結構なんだが。
俺なんか院の内輪の発表会で物理やら数学の人らがいる中でソフトウェア論文の発表やったら苦笑の嵐だったしwwww
>>914 実際は無能な奴が大学に残って、優秀だと思われていた奴がなぜか欝入って派遣行ったりするんだけどな。
世の中わからんね。
>>917 「PHPにシェアを抜かれた言語は終了」とでも思ってる馬鹿なのか、
C++のシェアが少しずつ減っていることを今さら知った情弱なのかわからん。
919 :
デフォルトの名無しさん :2010/01/12(火) 22:38:46
でも全ての言語はC/C++が礎となっている
まあ簡単な方に流れるのは自然の摂理だわな
>>917 これって趣味グラマの統計?
求人情報の統計?
>>921 >The TIOBE Programming Community index gives an indication of the popularity of programming languages.
>The index is updated once a month. The ratings are based on the number of skilled engineers world-wide,
>courses and third party vendors. The popular search engines Google, MSN, Yahoo!, Wikipedia and YouTube
>are used to calculate the ratings. Observe that the TIOBE index is not about the best programming
>language or the language in which most lines of code have been written.
だって。
山ほどあるLLからPHPが抜け出したのは、やっぱ手軽さが評価されたんだろうか。
xamppの存在が大きいだろう perlも入ってるとは言え、phpメインだろうし
何で匿名で虚勢張るの? 意味ないよね
phpでスタンドアロンのexe吐けるの?
exe吐ける
bamcompile
志村67
>>930 lisp処理系は職人さんがマシン語でじっくり丁寧に作ったものなのか?
少なくともLISPの歴史はCより長い
でもCはLispの影響は受けていないが、LispはC向きに作られたOS上で動くように修正されなければならなかった。
「C/C++が礎となってる」の意味によるよな a)シンタックス等の記述方法がC/C++を手本にしている b)コンパイラ・インタプリタ(処理系)がC/C++で書かれている c)自己記述が可能(自己の処理系を作れる)だが実行環境たるOSがC/C++で書かれている a)だと「全ての」というには無理がある lisp, FORTRAN, COBOL, Pascal, BASIC, Ruby, Python等多数に怒られそう せめてALGOLと言った方がまだ広がる b)になると多くに該当しそうだけど「全て」というには気がひける LLの多くはこの時点で脱落だろうね c)になると現代的には流石にほぼ全てと言って過言ではないかも Adaとか特殊なものを除くとOSはほぼC/C++だからなぁ
>>935 だったらほぼすべての言語がC/C++の影響を受けてるってことだよ。
影響を受けているとか、どの言語のほうが格上だとか、そんなことどーでもいいだろw
なるほど。 これからは自分がやりたいことをやりやすい言語を自前で実装する時代なんだな。
スマートポインタは一体どうなったんだろうな・・・
まじか。phpってすげぇじゃん。 ・・・でも何でWEBでしか使われないわけ?
Lispって理解できない。 というか理解しようという動機が見つからない。 理解できたときの快感は半端無いらしいが。
phpspotの悪口はそこまでだ
>>942 Lispって簡単じゃん。
Helloworld、関数、分岐、再帰、マクロ
はい終了
>>944 いやいや、深遠さはたぶん尋常でないよ。
でも職場で他のヤツができないからあんまり流行らないのかな?
>>945 Lispの深遠さ=計算機科学の深遠さ
だから基礎を学んだ人間にしてみればLispは
>>944 で十分
一方言であるところのCommon Lispの仕様は歴史的経緯もあってかなり大きいけど、 総称的にLispという時、それはむしろ「シンプルで深い」という方向のものだと思う。
>>945 LISPやFORTHでなんかつくろうとは思わないけど、極めて合理的な処理原理には学ぶものはあるな。
一度は作ってみるべきものじゃないか?
LispでできることはHaskellでやったらもっと簡潔に書けることが多いと思う。
遅延評価さえあればマクロを使う必要すらないしな。
>>946 まて、その理論だと
猛者にはTuring Machineがあれば十分
って言っている様なものでは?
現実的には猛者だとしてもリアルTMだけだと・・・。
Turing Machineなんて本物あっても 絶対つかえねぇなw
Turing MachineでTuring MachineをラップするTuring Machineを作れば良い
visitorパターンとか、たまにデザインパターンというものを 見聞きするのですが、それをC++の例で解説している Webサイトはありませんでしょうか? よろしくお願い申し上げます。
最近C++を勉強し始めたばかりで、ただいまコンソールアプリケーションだけでのドラクエ風RPGの 戦闘処理部分だけを作ってるんですが、どうしてもうまくいきません…… 具体的にはHP,MP,攻,防,命中,素早さ といったステータスをもつクラスPlayer4人と、敵クラスEnemyを3人用意して 1: Player[0]〜[4]のコマンドとそのターゲットをこちらが選択する( とりあえず「たたかう」だけで ) 2: Enemy[0]〜[3]が自動でコマンドとターゲットを選択する( いまのところ乱数で ) 3: 各キャラが素早さ順に選択されたコマンドを実行する 4: ターゲットになったキャラは、相手から攻撃と命中のステータスをうけとって、命中判定、ダメージ計算を行う 5: これを繰り返してどちらかのパーティが全滅するまで続ける このように実現したいのですが、3,4の部分がうまくいきません…… プレイヤー1人対敵1人のときは struct Buffer { int ATK; //相手の攻撃力 int DEX; //相手の命中力 } といった構造体のやりとりでなんとかなったのですが、ターゲットを選択する処理だけがどうすればいいのか分かりません ネットに転がってるRPGのオープンソース見ても複雑すぎて見当がつきません……どうかご教授願います。
そもそも、味方4名である必要なし。 人物1-100人のバトルロワイヤルでいい。 そのほうが簡単。 flgがあって味方は選択しないようにする。 敵味方と分類すれば似た処理を二つ用意しなければならない。
>>957 何が、どう、なぜうまくいかないのか分からない。
というかどうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。
>>957 Level0のおいらがエスパーすると
Buffer Touma;
Buffer Index;
Buffer Komoe;
Buffer Maika;
じゃなくて
Buffer[20000] Sisters;
にすればいいんじゃないか?
ゆとりは自分の脳内の望みとか快楽に、意味もなく普遍性を見出すよな。 だから「僕の望みと現実が違うんです」と書けば、それだけで現状のすべてが伝わると思ってる。 地球の片隅でひっそり生きてるお前の願望のディテールなんか、誰もわからんってのw
>>959 の言う通り
「どうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。」
ってのはどうしようもない。
誰に対する攻撃かを保存する変数を追加すればいいんじゃねえの
確かに見返してみると意味不明な文章でした……スレ汚し大変申し訳ないです 戦闘処理は専用の戦闘クラスが受け持って、そのメンバ変数にオブジェクトPlayer[ ] とEnemy[ ]を持っているんですが、 戦闘コマンドの選択はPlayerクラスのメンバ関数で、先に書いた構造体Bufferを用いて Buffer Player::Command() { Buffer buffer = { this->ATK, this->DEX } //自分の攻撃力と命中力を入れる return buffer; } として、さらにその後Playerのターゲットを選ぶメンバ関数 int Player::SelectTarget でターゲットを選択し、 クラスEnemyの引数にBufferをもつような「攻撃を受ける」メンバ関数に、プレイヤーのBufferを渡し、その中でダメージ計算を行う。 Enemyも同様にして、自動でATK、DEXを入れBufferを返し、ターゲットを決めてPlayerの関数に受け取らせてダメージ処理を行う、という風に考えていました しかしターゲットを選ぶ際、戦闘クラスで決めた敵の番号(もしくはプレイヤーの番号)をどうやってターゲットを決める関数に渡すか、で詰まってしまいました 死んだ敵を選択肢から除外しようと思ってもEnemyクラス内でprivateな変数HP(体力)をPlayerクラス内で確認できないし、敵も同様です。 それに敵がクラスEnemyの関数で乱数によりターゲットを決める際、プレイヤーが4人で固定ならばいいのですが、後々味方が2人や3人で戦闘を行う際、 戦闘を行うプレイヤーの数を確認し、その幅で選択肢を決める、といった処理の仕方にも悩んでいます…… また戦闘しているPlayer, Enemyの全員がコマンドを選択した後、STLのvectorかlistにまとめてPlayerオブジェクトとEnemyオブジェクトを入れて素早さ順にソートをし、 それからList[0]( すばやさ200のPlayer[2] )の行動 → List[1]( すばやさ190のEnemy[1] )の行動 → …… といったように各キャラの素早さ順で行動を実行しようとも考えていたのですが、 List[0], List[1]といった風に再度番号を割り振ってしまった後、どうやって各キャラの狙ったターゲットを判別しBufferを渡せば良いのか、という処理も見当がつかないのです 自分でも混乱して客観的把握ができないため、まだ不明瞭、説明不十分なところがあればもう少し日本語の勉強をしてから出直します…
いっぺんに完成形を目指しすぎな気がする
publicなBattleFieldクラスに参加中の戦闘員を登録して、死んだ場合は通知して除外 つーか何でもかんでもprivateにすればいいってもんでも無いベ
面倒だから、ATBにしろよ。 それぞれスレッドで動かしておいて シグナル来たらメインが動かす。
いまいち概要がつかめないからまあ適当で。 >Enemyクラス内でprivateな変数HP(体力)をPlayerクラス内で確認できない ・publicにする。 ・Enemyクラスに自分が死んでいるかをどうか返す関数を実装する。(Playerクラスも同様) >プレイヤーが4人で固定ならばいいのですが、後々味方が2人や3人で戦闘を行う際 ・オブジェクトPlayer[ ] とEnemy[ ]を管理するクラスを作成する >どうやって各キャラの狙ったターゲットを判別しBufferを渡せば良いのか、という処理も見当がつかないのです ・行動順にするのにポインタを使う。 ・オブジェクトPlayer[ ] とEnemy[ ]へのインデックスを配列として管理する。 ・オブジェクトPlayer[ ] とEnemy[ ]に自身を特定するための変更されないユニークなIDを割り振り、攻撃者はそのIDをターゲットの識別に用いる。
ソートした後にコマンド登録を促がすという単純な方法もあるねw
>>969 今はいいけど、それってあとあと困るんじゃね。
魔法とか、詠唱時間が+される仕様だったりすると。
あと、行動順にコマンド入力になるから、一般的なコマンド入力後の戦闘方式(FFようなリアルタイムバトルじゃないもの)と感じが変わっちゃうかと。
皆様ご返答ありがとうございます。 敵のHPをpublicにするというのは盲点でした。言われた通りカプセル化に拘り過ぎていたかもしれません 戦闘参加中のプレイヤーと敵のオブジェクトを管理するクラスというのは戦闘処理クラスと違って、 「戦闘場所」だけを管理するクラスのことでしょうか。少し考えてみます ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか 確かにそのようにするとソート後にコマンド選択を促すという方法も取れそうな気がします 自分自身がポインタ操作、参照など完全に把握し切れてないので少し勉強し直してきます… あとATBは少し難しそうなので敬遠してました……TATBまだなんとかなりそうなんですが、 リアルタイムな処理というものがまだ実感できないんです ご返答、重ね重ねお礼申し上げます
というかたぶん設計が根本からおかしいのでは? UIの問題とアルゴリズムの問題は別個ですよ
>「戦闘場所」だけを管理するクラスのことでしょうか。 じゃなくて、見方全体を、敵全体をそれぞれ一元に管理するもの >ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか ごっちゃにするなよ。 「ポインタ」と「オブジェクト自身に固有な数値を持たせる」は別だぞ。 まぁポインタも固有な数値ではあるが。 リアルタイムバトルは・・・まだ早すぎる
>>972 に同意
図を書いて整理した方がいいと思う
特に、PlayerとEnemyで違う部分は何か、共通な部分は何かといったところ
>>972 が言いたいのは
ターゲットを選ぶ -> UIの問題
構造体のやりとりでなんとかなったのですが…(ry -> アルゴリズムの問題
ってことか。
確かに、C++の言語の知識だけでなく、現実的には設計の知識も要求されるな。
Bufferに、攻撃者と被攻撃者のポインタ(もしくはインデックス)を入れたらどうよ。 ついでに素早さも入れとけば、Bufferを素早さでソートして昇順に処理するだけで済みそうだが。
class MyRand{ public: int operator()( int mmm ){ return rand() % mmm; } }; vector<int> retvec( int maxval ){ vector<int> ret( maxval + 1 ); for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; } MyRand mr; random_shuffle( ret.begin(), ret.end(), mr ); return ret; } ---------------- は、コンパイル通るのに、 vector<int> retvec( int maxval ){ vector<int> ret( maxval + 1 ); for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; } class MyRand{ public: int operator()( int mmm ){ return rand() % mmm; } }; MyRand mr; random_shuffle( ret.begin(), ret.end(), mr ); return ret; }
978 :
977 :2010/01/15(金) 03:02:27
続
>>977 のコンパイルが通りません。
何故でしょうか?
コンパイラは以下のものです。
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
980 :
977 :2010/01/15(金) 03:42:45
>>979 shuffle.cpp: In function ‘std::vector<int, std::allocator<int> > retvec(int)’:
shuffle.cpp:32: error: no matching function for call to
‘random_shuffle(
__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >,
__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >,
retvec(int)::MyRand&)’
です。
参考にならないかも知れませんが、以下ではコンパイルが通りました。
vector<int> retvec( int maxval ){
vector<int> ret( maxval + 1 );
for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; }
// ()演算子のオーバーローではなく、単純な関数にした
class MyRand{
public: static int myrand( int mmm ){ return rand() % mmm; }
};
MyRand mr;
random_shuffle( ret.begin(), ret.end(), MyRand::myrand );
return ret;
}
>>980 へぇ。要領を得ないエラーメッセージだねぇ。
たぶん、テンプレート実引数には外部リンケージを持つ型しか使えない、っていう制限に
ひっかかってるんだと思う。関数ローカルなやつはアウト。
982 :
977 :2010/01/15(金) 04:21:43
>>981 ありがとうございます。
「関数内クラスはテンプレートクラスには使えない」
というのを聞いたことがあるのを思いだしました。
ただ、
>>980 に載せたコードのコンパイルが通る理由が分かりません。
同じ関数内定義ですが、MyRand::myrand( ) は外部リンケージ可能な関数になるのでしょうか?
>>982 外部リンケージが必要なのはテンプレートの実引数であって、関数の実引数じゃない。
MyRand::myrand は外部リンケージを持たないけど、それを random_shuffle() に渡した
場合のテンプレート実引数となる型は単に int (*)(int) なので、リンケージの問題はない。
984 :
977 :2010/01/15(金) 05:20:24
>>983 ありがとうございます。
実引数の『型』の問題ですね。
ごっちゃにしてました。
それってC++0xからおkになるんだっけか
T get_t(); const T &get_crt(); f(get_t()); f(get_crt()); // 違うfを呼び出す 関数の戻り値を受け取るfの定義を引数型が参照かどうかで区別したいのだが、 上記のようなオーバーロードをする方法はない?
直でオーバーロードは無理
そこでテンプレートですよ
気になってやってみたけど template <class T> void func(T t) { typedef is_ref<T>::type tag; void func(t, tag()); } Obj obj; Obj &ref= obj; func(obj); func(ref); 見たいな感じでやろうとしたけど、だめだった
990 :
989 :2010/01/15(金) 17:57:51
ポインタなら同じ方法でできるんだけど参照はこの方法だとなんでかできない。よくわからないわ
991 :
986 :2010/01/15(金) 18:49:52
f(get_t()); // void f(T&&); f(get_crt()); // void f(const T&); 右辺値参照があればこんな感じで区別できるはずだけど やっぱ今のところは無理か…
1000は私がとります
1000なら小沢逮捕!
でも小沢がいないと次の選挙で自民党に勝てない。
997
え?
-_-
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。