1 :
デフォルトの名無しさん :
2009/06/14(日) 10:14:10
2 :
デフォルトの名無しさん :2009/06/14(日) 10:15:25
3 :
デフォルトの名無しさん :2009/06/14(日) 10:16:10
4 :
デフォルトの名無しさん :2009/06/14(日) 10:17:19
5 :
デフォルトの名無しさん :2009/06/14(日) 10:18:34
6 :
デフォルトの名無しさん :2009/06/14(日) 10:19:28
結論 Cでいい
8 :
デフォルトの名無しさん :2009/06/14(日) 10:25:44
最悪言語C++は不要 スレも不要
C++で作れない人にとってはC++は不要 Cスレに帰れ
c++最高
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
誤爆
テンプレはまだ続きます
『C++再考』
『C++サイコ』
std::string myString = GetHogeString(); みたいにした場合、これ以降 myString に対する操作はすべて myString.c_str() のみで、 その他の操作はいっさいしないと仮定した場合 const char * pStr = myString.c_str(); としておいて、以降ずっと(いつの日かmyStringが破棄されるまで) pStr を使っていても問題ない?
>>18 問題ない。
myString が破棄されるか、 myString の非 const メンバ関数を呼び出すまで
c_str() の戻り値は有効。
規格書広げるまでもなく "いつの日"が1msec後で、1msec後にpStrが向こうになったら困るから、 "いつの日か"破棄されるまでずっと有効。
開封後はお早めにお召し上がりください
仮に class A { public: A() { m_String = ::GetHogeStr(); m_pStr = m_String.c_str(); } const char * GetStr() { return m_pStr; } std::string m_String; const char *m_pStr; }; みたいにしてあった場合、例えば std::vector<A> a; とかやってると a の操作によっては中身が再配置されてまずいんでないの?
>>22 おまいは何を勘違いしているんだ。
m_pStrの中身が0x12345678だったとして、
仮にアフリカに再配置されたとしても0x12345678のままだぞ。
いや、そうじゃなくて std::vector<A> vec; A a; vec.push_back(a); const char *a_str = vec[0].GetStr(); vec.push_back(...); vec.push_back(...); ... てやったときにさ、a0 が最後まで無効にならないって保障はあるのかと。 vec が保持してるのは A* じゃなくて A じゃん。
すまん a0 → a_str とよみかえてくれ
>>22 元の質問ではっきり「これ以降 myString に対する操作はすべて myString.c_str() のみ」って
前提がおいてあるのに、なんでわざわざ問題のある状況を作って「まずいんでないの?」とか
スレ汚すの?
スレを汚したい年頃だからさ
パンツ汚したら親に見つからないように風呂場で洗え^^
myString がグローバル変数だとか、単なるローカル変数ならいいけどさ、 クラスのメンバだったりするとまた話は変わってくるでしょ。 myString に対するそうさが c_str だけとわかっていても、それを含んでいる インスタンスの扱いによっては、myString を直接いじらなくても おかしくなる可能性があるんじゃない?
>30 え!マジで
class A {...} std::string <A> とかやったら、内部バッファが拡張されるたびに あたらしい領域にAのコピーがつくられて、 古い領域にあるA が全廃棄になるものとばかり思っていた
そもそも値のセマンティクスを持たないものをSTLコンテナの中に入れちゃらめ^^ R.マッサー先生がそう書いてたでしょ?
>30
>インスタンスの扱いによっては、myString を直接いじらなくても
>おかしくなる可能性があるんじゃない?
何でわざわざmyStringが破棄される場合の話がでてくるの?
はじめから
>>18 でもmyStringが破棄されたときは問題だと認識されているが。
いつmyStringが破棄されるか、というのはまったく別の話だろう。
あまり考えずに丸投げで聞いてみるが C++でCPSスタイルって出来る? テンプレート/関数ポインタともに 型の制限は受けるよね、多分
できるよ。
template <typename T> void mandelbrot(T cont){ //z=z*z+cを色々計算 cont.parse(z.real(),z.imag()); } void mandelbrot2(void (*cont)(double,double)){ //略 cont(z.real(),z.imag()); } 一応これで出来そうには思うが 2回以上連続して適用は無理だよな operator()で統一するぐらいが現実的か
前スレのABC案に答えてくれた人ありがとうございました。 とりあえずB案で、それがボトルネックになる事態が発生するまでそうしておこうと思います。
普通Aからだろ。まあいいが。
個人的にはCがいいかと思っていたのですが、Bでもさほど問題にはならないだろうし、 なにより早すぎる最適化であるという指摘を受けて、なるほどと思いました。 Aであることのメリットは何でしょうか?
ちなみにCがいいかと思った理由は、スコープを限定できる(C#でいうusingのような)ことと、 ループ内でインスタンス生成することのコスト(が最適化されるかどうかも含めて)を、 そのコードを初めて見た人が心配しなくてすむだろうと思ったからです。
ブロック式が出てきたら関数化が必要だと思うきがす・・・るけど,採用しなかったならOK
>>38 お前は何を聞いていたんだ。
コピーコンストラクタには3歳児が10まで数える処理が
含まれているって言ったろ?
44 :
39 :2009/06/15(月) 23:18:20
>>40 ああ、ごめん。おれもBだわ。勘違いしてた。
>>43 コピーコンストラクタは速いが、デストラクタでは100まで数えておふろから出る処理が含まれてたと思う
それが問題になるならその時に対処すればいい
そもそも真にボトルネックになっているかどうかが分からない。 実測するしかないだろう。 ・コピーコンストラクタで毎回生成する方式 の方が速いこともあれば ・代入演算子で毎回生成する方式 の方が速いこともある。 前者は毎回メモリをスタックに確保する必要がある+コピーコンストラクタを起動する必要がある が、確保場所は好き好きに決めて良いから速いかもしれない。 後者は毎回メモリをスタックに確保する必要がない+代入演算子を呼び出す必要がある が、確保場所は既にきまっちゃっているわけで、自由度がないかもしれない。 てな感じでしょうかね。
可能な限りconst使いなさいよという話があると思います。 void func(char *data) { std::cout << data << std::endl; } // こういう関数について void func(const char *data) // こうしよう、と書いているけれど void func(const char * const data) // こうじゃないのはなんで? あと、これが普通に動作するのはなぜですか? void func(const char * const data) { delete [] data; }
理由1 (const) char * は const char * const に暗黙変換できないので void func(const char * const data)はchar * をキャストしないと受け取れなくて不便だから 理由2 dataはスタック変数だから壊しても被害が少ないから deleteの理由 例えばこんなxがfを抜けるたびに破棄されることには疑問は抱かないだろう これと同じ事で定値性と破棄可能性は無関係 void f(int n){ const x = n; }
>>49 >(const) char * は const char * const に暗黙変換できないので
おいおい
constをはがすのではなく、つけているだけなので暗黙のキャストは可能と思っています。 破棄可能性が無関係であること、ありがとうございました。
全然別人だけど、 MyClass *型 は MyClass const *型へと暗黙の型変換は出来るんじゃないの?
>暗黙のキャスト って用語的に正しいの? 暗黙の型変換 と 明示的な型変換 があり、明示的な型変換はキャストと呼ばれるんだと思って居たんだが。
あ、たしかに、暗黙の型変換って言いますね。ごめんなさい。
55 :
53 :2009/06/16(火) 20:57:46
>>54 いや、俺が無知なだけなのかもしれない。
Type conversionの別名がキャストだったりするのかもしれん。
まあ誰か有識者よろしく。
どんな型でも入れられるTreeってないですか?
>void func(const char * const data) hoge(const int a) とは書かないのと同じ理由かと。
const int aとなぜ書かないのだろう、とも思っていたのですが、 呼び出し元に影響がないので、特に問題になることもないだろうという感じですか? ちなみに参照になると、func(const MyClass &p) と書きますよね。 この場合、一時オブジェクトを束縛する効果があると最近知りました。 ポインタの参照を受け取るときはやっぱり func(const MyClass * const &p) とすべきなのか、 それとも、アドレスは値コピーされるので一時オブジェクトが引数に使われていても問題ないのか なんだかよくわからなくなってきました。
>>58 >const int aとなぜ書かないのだろう、とも思っていたのですが、
>呼び出し元に影響がないので、特に問題になることもないだろうという感じですか?
そう。
だって
void foo(const int a);//下のと同一の意味を持つ表現
void foo(int const x);//上のと同一の意味を持つ表現
とかだったらどう頑張っても(aの値を変えても)コピー渡しである以上、
foo(b);
でbの値が変わることはない。
だからconstつけなくたって(つまりvoid foo(int x);だって)いーじゃん、と。
>ちなみに参照になると、func(const MyClass &p) と書きますよね。
そうしないとconstオブジェクト渡せないでしょ。参照渡しである以上、
const付けておかないと値が変更されるかもしれないじゃない。
>この場合、一時オブジェクトを束縛する効果があると最近知りました。
まあ今回のとは全然別の話だけどね。
>>56 bool comp(const void*& l, const void*& r) {...}
set<void*> tree(comp);
tree.insert(new SweetMemory);
tree.insert(new StolenBike);
tree.insert(new MyBoss);
61 :
59 :2009/06/16(火) 21:33:40
>>58 >ポインタの参照を受け取るときはやっぱり func(const MyClass * const &p) とすべきなのか、
>それとも、アドレスは値コピーされるので一時オブジェクトが引数に使われていても問題ないのか
>なんだかよくわからなくなってきました。
じゃあ問題。
……………………………………………………
YourClassを君の自作クラスとしよう。
void foo(const YourClass x);//下のと同一の意味を持つ表現
void foo(YourClass const x);//上のと同一の意味を持つ表現☆
とかだったらどう頑張っても(xの値を変えても)コピー渡しである以上、
foo(y);
でyの値が変わることはない。だから
void foo(YourClass x);
でよい。
……………………………………………………
ここそこでYourClassをMyClass *に読み替えてみよう。
どうなるかな?
とくに☆に着目。
うーん。 func(const int a); これは、funcの中でaを変えるつもりはないので、間違えて変えてしまったときにエラーに なるようにしようという、関数作成者からみた防御策になるので便利だと思ったんですけど。 void sub(int &a) { a = 3; } という関数をfunc内で呼び出しちゃうなんてことも防げますよね。 >>ちなみに参照になると、func(const MyClass &p) と書きますよね。 >そうしないとconstオブジェクト渡せないでしょ。参照渡しである以上、 >const付けておかないと値が変更されるかもしれないじゃない。 この辺と同じ話なんですけど
あまり話の流れを読んでないが メンバ関数にしてconstを付けるっていうのはどうよ ただ、変数じゃなくて関数全体がconstになってしまうが
>>61 void foo(const YourClass x);//下のと同一の意味を持つ表現
void foo(YourClass const x);//上のと同一の意味を持つ表現☆
この、YourClassをMyClassに変えて、ということですが、
void foo(const MyClass * x);//A
void foo(MyClass * const x);//B Aとは全然違う意味を持つ表現
void foo(MyClass const * x);//C Aと同一の意味を持つ表現
と思います。
>>62 ああ、なるほど、経験のあるC++初心者ないしそれ以上なのか。
完全な入門者相手のつもりで書いてしまったわ。
すまんかった。
>void sub(int &a) { a = 3; }
>という関数をfunc内で呼び出しちゃうなんてことも防げますよね。
おっしゃるとおりだね。
まずはintじゃなくてYourClassだったとして考えてみる。
一般にはYourClassのコピーコンストラクタないしデストラクタが非常に重い処理だと考えられるので
>func(const YourClass a);
>これは、funcの中でaを変えるつもりはないので、間違えて変えてしまったとき…(ry
変えるつもりがないのなら
func(const YourClass& a);
にした方がコストが低くていいでしょう。
ここでYourClassがintだったとすると
func(const int& a);
よりは
func(const int a);
func(int a);
の方が良いでしょうってことになるね。
ということで、
66 :
61 :2009/06/16(火) 21:56:55
>>64 そのとおりです。
いやごめん、入門者相手のつもりだったから。
>void foo(MyClass * const x);//B Aとは全然違う意味を持つ表現
xはconstだが*xがconstでないのだ
なんていう事は分かっている方だったのね。
はい、一応その辺は理解しているつもりです。(お気遣いさせてしまいすみません) その上で、funcの中でpを変更するつもりがないのであれば、 void func(const char * const p) ないしは、 void func(char const * const p) とすべきではないのかと思った次第です。
> pを変更するつもりがないのであれば
これを抜かして
>>48 を書いてしまったのが悪かったのかも。。。重ねてすみません。
69 :
61 :2009/06/16(火) 22:08:40
>>67 いやこっちこそ下らんレベルで長レスしてすまんかった。
>その上で、funcの中でpを変更するつもりがないのであれば、
>void func(const char * const p)
>void func(char const * const p)
>とすべきではないのか
俺もそうする事はある。"ssttrriinngg"なんてものを渡す時とか。
そうすればpが指すオブジェクトが有効な物を渡されている限り必ず有効であることが保証されるからね。
>void func(char *data) { std::cout << data << std::endl; } // こういう関数について
>void func(const char *data) // こうしよう、と書いているけれど
>void func(const char * const data) // こうじゃないのはなんで?
これは単に
>void func(char *data) { std::cout << data << std::endl; } // 1.こういう関数について
>void func(const char *data) // 2.せめてこれくらいはしよう
>void func(const char * const data // 3.ここまでできるなら完璧だがやっても関数の副作用には変わりない。
>void func(char * const data) // 4.最低でもこんなのはやめてね
っていう程度じゃない?
ポインタ変数だからconstが2箇所付けられるがために紛らわしい話になっているけど、
要するに関数の副作用をできるだけ防止するためにconstを付けようという文脈だろうとおもう。
1.だと副作用を防げないから2.にしよう。
4.だと副作用を防げないから3.にしよう。
と言った程度でしょう。
70 :
61 :2009/06/16(火) 22:25:05
参照渡しにて。
>一時オブジェクトを束縛する効果があると最近知りました。
これは認めないとコピー渡しと同じインターフェースで関数が使えないしね。
C++ Labyrinth
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html ご存じかもしれないけど、参照渡しではないけど似たようなもの。返り値版。
>あと、これが普通に動作するのはなぜですか?
>void func(const char * const data) { delete [] data; }
void func(const char * const data) { delete data; }
じゃなくて?
いずれにせよ確かに不思議だが、
[cppll:9262] const pointer の delete
ttp://ml.tietew.jp/cppll/cppll/article/9262 ここによると
> Draft ANSI C++ Standerd - Nov 1996 Working Paper より:
> <引用>
> 5.3.5 Delete [expr.delete]
> ...
> Note: a pointer to a const type can be the operand of a
> delete-expression; it is not necessary to cast away the
> constness (_expr.const.cast_) of the pointer expression
> before it is used as the operand of the delete-expression.
> </引用>
って書いてあるよ。
やばい! 雷なって来たから消すわ。 落雷されるとホント困るし。
>>70 おお、有益な情報をありがとうございます。
> 『プログラミング言語 C++ 第3版』
ちらちらとしか読めていなくて、いかんなあと思ってます。
const pointerのdeleteについてもありがとうございます。
逆に、deleteは指定されたポインタの値を、決して書き換えることはないということなんですかねえ。
delete後にNULLを代入するコードにはそういう事情も含まれてるんでしょうねきっと。(いつも不思議でした)
要素10オブジェクトからidが一致する1つを見つける 処理を簡単かつ高速に記述するにはどうすればいいですか?
つmap
ハッシュが最速
>>73 idが順序もってるならソートしておいてbinary search
楽さ 76 > 74,77 > 75 早さ 75 > 77=74 > 76 標準ライブラリのマップ実装はtreeなので77に近い
>>74 mapがいいのですかね?
idは追加削除が頻繁におきます
でも10個までしか登録されません
圧倒的に最速。 inline void set(size_t id, int val) { assert(id < 10); a[id] = val; } inline int get(size_t id) { assert(id < 10); return a[id]; }
このスレのレベルが一変した瞬間でした
トライ木
83 :
デフォルトの名無しさん :2009/06/16(火) 23:49:24
いろんなクラスをtypedefしたtypedefs.hがあって、 そのtypedefs.hをインクルードするclass Aがある。 で、class Aのtypedefをtypedefs.hに記述したいんだけど、 これだと循環インクルードになってエラーになっちゃう? // typedefs.h typedef boost::shared_ptr< X > x_ptr; ←こんな奴をまとめたのがtypedefs.h typedef boost::shared_ptr< A > a_ptr; ←こんなのをtypedefs.hに書きたい // a.h #include "typedefs.h" class A{ x_ptr x; }; ←typedefs.hの中の奴を使ってる。 で、typedefs.hに#include "a.h"を書いたらダメっぽいんです。 どうしたらいいですか?
extern class A;
速度を求めるならハッシュでいいだろ。 完全ハッシュ関数はgperfで求めればいいし。
gperfじゃだめだろ
多くても10個のIDを調べるだけなんだから 頭から順に走査すればいい 確率的には比較回数5回以下になる よけいな計算をするほうが遅くなる
id同士の比較が一定時間なら, Hash(id_A)<==>Hash(id_B) と id_A<==>id_B では後者が有利かなぁ
91 :
89 :2009/06/17(水) 00:06:38
平均比較回数については不明だった 最大でも10回ということしか保証できないな
class Hoge { int id; }; Hoge hoge[10]; hoge[i].idを比較する場合どうなんですかね?
idはどうやって決まるの?
>>93 関数でセットします
void SetID(int index, int id)みたいな感じで
ごめん、そういうことじゃなくて IDの範囲やら規則性やらがあるのかってこと。
>>95 1から32000までと考えてください。
ただ、セットされるのはそのうち10個のみ
数字を入力してその数字に見合った数だけの文字を表示するためのプログラムを組んでいるのですが 二重ループがうまくいっていないらしく希望の結果になりません、修正点を教えてください 希望のプログラム 5(ここは任意の数字を入力) * ** *** **** ***** このように任意の数字を入力しそれまでの間1づつ増加した*を並べたいです 組んだプログラム #include<stdio.h> int man() { int a,b,c; scanf("%d",&b); a=0; c=0; while(a<b) { while(c<=a) { printf("*") c++; } a++; printf("\n"); } }
上記のプログラムで走らせると * * * * * となってしまいます、 * ** *** **** ***** とするにはどこを修正すればいいのでしょうか、よろしくお願いします
#include<map> map<int, int> m; void SetID(int index, int id){m.insert(make_pair(id, index));} int GetIndex(int id){return m[id];}
>void SetID(int index, int id)
使用者側がindexも分かっているのなら、
それこそid==indexにしてしまって
>>80 みたいにしちゃえばいいんじゃないの?
皆さんどうもです なんとなく数本サンプル作ってベンチしてみます どうもでした
#include<stdio.h> int man() { int a,b,c; scanf("%d",&b); for(a = 0; a < b; a++) { for(c = 0; c < a+1; c++) { printf("*"); } printf("\n"); } }
質問させてください。 string ANA string JAL があり、そのそれぞれ i番目の文字と j番目の文字を比較したいと考えて、 if ( ANA.at(i) == JAL.at(j) ) { cout<<"unko"<<endl;} としてみたんですが、おそらくこれが原因で実行時にabnormal program terminationだと怒られました。 at(i) でi番目の要素を取り出せるというのは安易なのですか?参照が返すということですが、そのまま比較はできないんでしょうか?
安易に取り出せるよ 範囲内ならば。
at()を使うとstd::out_of_range例外を発生する事がある
string ANA の0番目の文字がAで1番目がNで2番目がAだと思ったんだね
>>110 そこまで逝ってないです><
とりあえず at() については普通に取り出せるはずなんですね。
なんかいじってたら強制終了するようになったし、もう一回隅々まで見直してみます。
ほんとにありがとうございます。
>>111 そっか、安心したw
「abnormal program termination」とだけしか出力されないのかどうかが気にはなるけれど
とりあえずcatchしてみたらどう
STLコンテナにカスタムアロケータを渡したいんだけど、毎回 std::vector<class_x, my_allocator<class_x> > なんて書くのは面倒くさい。 ポリモーフィックに扱わないなら、 template<class T> my_vector : public std::vector<T, my_allocator<T> > とかやってもだいじょうぶだよね? マクロとかtype generatorも考えたけど、どうもしっくりこなくて… はやくC++0x来てくれ。
大丈夫だよ。
>>113 0xは2013年か遅ければ2015年じゃないと無理だよ
class Hoge{ #ifdef USE_FOO Foo m_foo; #endif #ifdef SPECIAL_BAR SpecialBar *m_bar; SpecialData m_d; #else Bar *m_bar; #endif /*......*/ }; こんな調子の見苦しいクラスを何とかしたいんですが C++流ではどう書くのがいいんでしょうか? sizeof(Hoge)は最小限にして、出来れば継承とテンプレートを使わないのが理想なんですが
標準出力ストリーム ってstd::coutの事でしょうか? std::coutが標準出力ストリームを表す抽象的なインスタンスと考えて良いのですか? std::ostreamクラスを継承したインスタンス群(std::cerrとか)は標準出力ストリームとは 言わないのですか?
std::coutを標準出力ストリームというのであれば、 std::cerrは標準エラー(出力)ストリームといいそうなものです
>>116 継承かテンプレートを使うのがC++流です。
えー じゃあせめて多重継承を使わずになんとかなりませんか
>>116 なんだこのクソ設計はw
C++で設計をしている様には到底見えないぞ。
>出来れば継承とテンプレートを使わないのが理想
C++コーディングにおいてそんなのが理想だなんて状況聞いたことない。
C++にて 標準入力std::cinから受け取るものが intかstd::stringか分からないときってどうすれば良い? 例えば 入力が「int型の数字」または「人名(数字を全く含まない)」または「不正な入力」 があるとして。 また人名はtaro, hanakoの2通りだとして。 if(std::cinから受け取るものがtaroの時)
strtokが遅い場合みんなどうしてるのですか? tolowerも遅くて使いもにならん助けて
125 :
123 :2009/06/17(水) 21:04:46
誤爆した ごめん。 if(std::cinから受け取るものがtaroの時){ std::cout << "taroを受け取りました。" << std::endl; } else if(std::cinから受け取るものがhanakoの時){ std::cout << "hanakoを受け取りました。" << std::endl; } else if(std::cinから受け取るものがint型の数字の時){ std::cout << "数 = " << 受け取った数 << " を受け取りました。" << std::endl; } else){ std::cout << "入力が不正です。" << std::endl; } という感じにしたいのだけど、 いったいどうすれば実現できる??
怪しいにおいがプンプンするけど、 ここは最小公倍数を取って、std::string。 intが欲しくなったら後で変換すればいいじゃない。
自分で書く
>>128 Spiritは確かに最終兵器すぎるなw
130 :
123 :2009/06/17(水) 21:15:34
>>126 std::stringで受け取るのね。
そもそも
std::cin >> str_obj;
としたら最初から区切り文字が現れるまでが入るのだっけか?
よく覚えとらん。。。
>>125 stringで受け取って数値のみ、人名に使える文字のみ、混在で場合分けすればいいだけでは?
>>121 クソなのは重々わかってるんですが、既存ソースなのであまり大がかりにいじりたくないんです
継承はあまりクラス階層増やしたくないのと、独立したifdefがいくつもあるので
素直にやると多重継承になっちゃうので避けたい所です
テンプレートはコンパイラの都合で使えません
>>122 一言では説明しにくいんですが、これ自体はあるデータの集まりで、
加工する方法が色々あって、コンパイル時にいくつか使う物を選んで組み込むんですが
ものによってはタッチしないデータがあるので、メモリ節約のためにifdefで殺してる感じです
加工する側のクラスも同じようなifdefが入り組んでるんで何とかしたいんです
>>128 Cのtolowerより高速なものってありますか?
136 :
123 :2009/06/17(水) 21:28:29
>>131 そうさせていただきます。
ありがとう。
g++についてきたGNU ISO C++ Libraryのstd::complexクラステンプレートの一部分より
C++ code - 13 lines - codepad
ttp://codepad.org/WZx9PlS4 ってなってるんだけど, なんでまた
一回ostringstreamで出力用文字列をつくってから
__osに渡してるの?
そのまま__osに出力しちゃだめなのだろうか?
つまり
__os << '(' << __x.real() << ',' << __x.imag() << ')';
にしちゃだめなの?
>>135 なんで?よく知らないから聞くのならいいとしても、覚えてないって理由で聞くのはおかしくね?
139 :
122 :2009/06/17(水) 21:40:12
>>133 ふへぇ。
メンテナンス性も失いたくないから別クラスにしたりはしてないって事だよね。
場合によって使う使わないのメンバをポインタにして動的に確保するようにしたらどう?ぐらいしか
アドバイスできないす。でもそれ既存のコードならそうもいかないよねorz
<<って書くたびにカーネルと通信することになるからでしょ。
だから安価も
>>137 >>139 って書くより
137 >> s, 139 >> s, >>s
って書いた方が効率がよい。
>>138 お前は俺の奴隷なんだから、黙って答えればいいんだよカス。
142 :
138 :2009/06/17(水) 21:46:04
ここまで荒れるのも久しぶりだな・・・
これで荒れてるのか?
146 :
123 :2009/06/17(水) 21:56:00
123(俺)!=135 123(俺)!=141 なんだけど。 みんな止めてくれ。。。
seekpとseekgの意味がstringstreamでは違うのに fstreamでは同じ意味になるのはなぜですか?
148 :
137 :2009/06/17(水) 21:58:22
>>140 そうなのか!
そこまで考えてあのコードなのね。。。
ありがとう!
ちなみに俺は
>>123 と同一人物です。
>>140 そうかなあ?それくらいバッファリングされるだろ。
個人的には出力途中で(バッファの吐き出しが起こった結果などで)エラーになって
出力が中途半端なところで途切れないようにするためかなと思った。
>>139 やっぱり難しいですか
クラスに分けてポインタ持たせることも考えたんですが、
たくさん作る必要があるクラスもあるので必要なければポインタも出来れば持ちたくないんですよね
#ifdef USE_FOO
typedef struct {
Foo m_foo;
} Foo_t;
#else
typedef struct {} Foo_t;
#endif
class Hoge{
Foo_t m_foo_t;
/*......*/
};
とかやってifdefをどっかに集めることも考えたんですが、
空の構造体もサイズ0にはならないんですよね
ifdefで行くか、少々のサイズ肥大は受け入れるかの選択になっちゃうのか…
>>150 肥大化してもいいと思える程度なの?
てっきり全部コミコミだと実行環境の兼ね合いでカッツカッツになっちゃうのかとおもってた。
153 :
123 :2009/06/17(水) 22:18:01
>>149 そういう理由もあるのね。
うーむ。ありがとう。
>>149 __osが何かも分からないのに勝手にバッファリングされたら困るだろ?
>>151 もちろん理想はゼロですけど、今後の拡張とかを考えるとポインタ数個程度の無駄はやむを得ないかなぁと
根本的な解決にはならないですけどね
全部は出来ないのでクリティカルな所はそのままifdef残っちゃうので
なんでそんな糞コード最適化しようとしてるの? 俺だったら、なるべく現状のままで動きゃいいって方針をとる。 もっとまともにしたかったら、全面的に書き直すから工数くれって言う。
泥臭いことを一切行わずに完結してるコードもなかなかお目にかかれないもんだけどね。
俺も今ウンココード直してるけど 直す過程でウンコ生産してるんじゃないかと心配している
自作クラスMyClassに関し、 static_cast<MyClass>(42) が有効に定義されているとして質問させてください。 MyClass hoge = static_cast<MyClass>(42); は必ず有効だと思いますが、これは MyClass hoge(42); も必ず有効になると期待して良いのですか?
ウンコは直すより出し直した方が早い
>>160 趣味で書いてるのはそれで何度も救われたが
仕事じゃなかなかやらせてもらえんよなぁ・・・
163 :
159 :2009/06/17(水) 23:30:06
#if 0 ウンコ #endif 出しなおした『ウンコ』
>>150 -Dオプションとcppを使ってソース吐かせる
>>156 そのうち書き直そうという話は出てはいるんですが、
書き直すにしても差し替えは出来るようにしないといけないので
結局どっかで同じようなことは必要になるんですよ
だから何とかその辺の設定を一箇所に固める方法を今のうちに考えてるんですがなかなか難しいですね
テンプレートが使えればいいんですけどね…
一つのクラスにまとめようとするからいけないんじゃねの? 別々のクラスとしてインスタンス作れば、取捨選択は楽じゃん。
メンテナンス性も失いたくないっていってるしなあ。 DirectXのFVFってどうやって実装されてたっけ? 似たようなにおいを感じるけど。
マクロでやるならこんなのかなあ #ifdef USE_FOO # define FOO_T(a) Foo a #else # define FOO_T(a) #endif class Hoge{ FOO_T(m_foo_t); /*......*/ };
template パラメータによって インスタンシエートでコンパイルエラーを出す方法ない? 特殊化せずに template<bool B0, bool B1,bool B2>class A{ void fn0(){if(B0!=true)"compile err";} void fn1(){if(B0!=true && B1 != true && B2 != false)"compile err";} // つらつら数百行 }; みたいな
template<bool B0, bool B1,bool B2> class A{ BOOST_STATIC_ASSERT(B0);//compile err BOOST_STATIC_ASSERT(B0 && B1 && !B2);//compile err };
BOOSTあれば何でもできるな。
BOOSTあれば俺の嫁がモニタから出てきますか?
というか、モニタに映ってるってことはどっかで撮影したってことだから 撮影現場に行けば嫁に会えるよ
アニメだと思われる
そういやソース中に冗談で/*hogehogeは俺の嫁*/とかやった事あるんだが 実際に製品になったゲームなんかをダンプすると、そういうメッセージが出たとか聞くんだが そういうのって何が原因で製品に残っちゃうんだろう
>>176 文字配列リテラルは、なんかの拍子で
静的初期化テーブル(? 名前よく知らん)に残るんじゃね。
>>175 アニメを撮影した現場に行けばいいと言ってるんだと思われる
3次をモニタに映せば2次な訳だから、2次を撮影したところにいけば3次になってるはずだし
で、おっさんが俺の嫁を製造している現場を目の当たりにした場合、翌日からどんなC-hinpoのしごき方をすればいいんだ。
そんなあなたに->*演算子
>>179 え、2次元でしかないと思いこんじゃってる人?
そんなんだから他のやつに嫁とられんだよ
>>171 thx
こうすれば評価をテンプレートの中に留め置けるんだね
不正値の導出になんで回りクドイ方法取ってるのか以前疑問を感じてそのまま放置してた。
183 :
デフォルトの名無しさん :2009/06/18(木) 21:35:53
C++を使ってCPUの温度を取得するプログラムを書きたいんだが、どういうアルゴリズムで書けばいい? XP borland C++ なんだが誰か教えてくれ。
>>183 C++にはCPUの温度を取得するなんてないからAPIを使うしかないだろうね。
詳しくは誰かがAPIスレを紹介してくれるだろう。
05/31
ttp://www.csci.yamanashi.ac.jp/~mino/ad2/2004/0531.html ここにある
> 注意! sizeof( ) を使った seekg/p ( ) に注意
> seekp, seekg を使ってポインタを動かす場合、第1引数にマイナスの値を指定することで、
> ポインタを前に戻すことができます。しかしこのとき sizeof( )を使って
> file.seekg( -4*sizeof(PersonalRecord), ios::end )
> などとすると、うまく行かないことがあります。(うまく行く場合もある)
> これは sizeof の結果が符号なし(負にならない)整数 ( unsigned int ) であるためです。
> sizeof( ) に負の数をかけるときは注意してください。
> int sizeofps = sizeof(PersonalRecord);
> file.seekg( -4 * sizeofps, ios::end );
> と一旦整数変数に代入するか、
> file.seekg( -4 * (int) sizeof(PersonalRecord), ios::end )
> などと、型を強制的に指定すれば安心です。
についてですが、
int型の負の数 * unsigned int型の正の数
ってどうしてダメなのですか?
189 :
187 :2009/06/18(木) 22:37:20
サンプルだから
その場合はしなくても、まあ問題ないけど、したほうがいいと思ってる人は ぜったい納得しないから、仕事とかだったらdeleteしたほうがいいな。
>>190 こんなとこで聞く前に一番下にエラー報告フォームへのリンクがあるから
さっさと報告してこい
194 :
190 :2009/06/18(木) 23:17:02
>>191 つまり着目しているところがちゃんと動けばいいじゃん。
ってことなんですね。
>>192 >その場合はしなくても、まあ問題ないけど
どうして問題ないのですか?
たいした量のメモリーリークじゃないからですか?
それとも仕様上勝手にdeleteしてくれたりするのですか?
>>193 まあ
>>191 さんのおっしゃるとおりいちいちエラー報告するほどでは
ないと思っていますので。
>>194 > どうして問題ないのですか?
「malloc free 論争」でググると、いろいろでてくる。
リンク先見てないけど、問題ないとおもうな リンク先で紹介されてるものがdaemonだったらごめんね
free-on-exit
どうやら 後始末はOSに丸投げしちゃおうという プログラミングスタイルもあるということですね。 ・・・。。。
fstreamではseekg()達が動くようですが、 std::cinでは無理だったりしますか? (@g++ WinXP)
解放しなくていいのか、そりゃ斬新だな 最近のwindows安定してるからこういうこと言えるようになったのかな・・・
仮想アドレス空間が実装されたのを最近というなら、最近だね
最近っていうか、DOSの時代から開放しなくても問題おこらないと思うよ。
Win3.1は解放しないと酷いことになってたと思うが 95もだっけ
そうなのか、windows9xはすぐメモリリークするソフトがあったら凍るイメージがあったから・・・
9xだとGlobalAllocで確保したメモリを解放しないのは不安が残る。あとメモリ以外のリソース全般も。 mallocが使っているであろうVirtualAllocは心配していないけど。
何にせよ、借りたものは返す。 貸してくれたやつが回収しに来るまで待つのは行儀が悪いと 感じる俺は古いのか??
世界が明日終わるなら、好き勝手なことしてすごしたいジャン。
古いね。基本は借りパク。他人に物貸すのは上げるつもりじゃないと友人続けられない。 だから俺は貸してといわれたら「断る」ということにしている。 new 演算子も上書きして、問答無用で bad_alloc例外を投げるようにしている。 大人になったら人に物を貸してなどと頼むのは恥知らずのすることだと 明治の人は実に立派だったんだなって思う。mallocとか最悪。
ま、普通はdelete, free()したほうがいい。 するなって話じゃない。
わかりました。じゃあ、 int *p = new int[10]; delete p; int *q = (int*)malloc( sizeof( int ) * 3 ); delete q; delete q + 1; delete q + 2; これで。
えっ
A.cpp class A { friend B ... } B.cpp class B { friend A } これどうやって修正しようw
家族ぐるみのお付き合い状態・・・?
classの利点カプセル化を崩すfriendは使わない方が良い
>>217 てっとり早く修正するにはどうすればいいの?
手っ取り早くは A.cpp class A { class *Bp; ... } B.cpp class B { class *Ap; } だが、根本的に設計が問題かもしれん。 それにクラス宣言は。ヘッダーでやれ
>>218 Class AやBが適切な関数を提供すればいいだけ。
A.h class B; class A { class *Bp; ... } B.h class A; class B { class *Ap; } にしろ
class *Ap;って何?
あ orz A Ap; です。orz
これじゃ通らない気がする
struct impA{}; struct impB{}; class A:impA{}; class B:impB{}; 仲良しなオリジナルA,Bクンはくんずほぐれつまぐわって貰って見目用に新たなA,B用意しな
>>215 まああり得なくはないと思うけど
普通はおかしい状態だな。
>>217 テンプレートを使う場合にfriendにお世話になることがある。
friend使うのなんて演算子のオーバーロードくらいじゃねぇの
>>219 >>221 互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
それじゃ何の解決にもならんだろ。
だから、フィールドとかメソッドとかなん? C++にそんな単語ないぞ。 それともビットフィールドのことか?
フィールド→メンバ変数 メソッド→メンバ関数 読み替えて。
某標準ライブラリで grep friend するとたくさんマッチするよ カプセル化が崩れてるの?
別に。メンバ関数を増やすよりもfriendの非メンバ関数にすべし、 できれば非friendの非メンバ関数にすべしっていうのが モダンなプログラム作法なので(C++ Coding Standardsなどを参照) メンバ関数を減らした結果として friend の非メンバ関数が増えるのは仕方ない。
>>232 勝手に別の言語の概念持ち込むなよ。
それとも、C#厨か?
じゃあせめて、メンバメソッドとグローバルメソッドを使いわけろ、カスが。
必死だなw
javaにはグローバルメソッドなんてもんは存在しないから メンバ関数がなぜ「メンバ」なのか理解できないのかもね。 フィールドもメンバ変数とは違う概念なんだけど C#厨にはそれも理解できないんだろうな。
237 :
デフォルトの名無しさん :2009/06/20(土) 22:54:03
こいつ、どんだけ必死なんだよww
とりあえず、ここは「C++」相談室なんだから C#とかjavaの方は帰ってくれませんか?^^
239 :
デフォルトの名無しさん :2009/06/20(土) 22:57:41
もう、このスレではメソッドとフィールドという単語は使わせません! あと、基底クラスをスーパークラスとかいう人も帰ってください。
241 :
デフォルトの名無しさん :2009/06/20(土) 22:59:15
C#厨はC++のメンバ変数をフィールドとか呼んじゃう恥知らず。
引っ込みがつかなくなったようだなww もう好きにしろwwww
用語もまともに使えないのにC++の相談に乗るとかできるわけないよね。
じゃあ乗らなければいい。黙ってろ。
確かにメソッドと言われてメンバ関数だと読み取れない程度に用語がまともに使えないレベルの
>>243 が相談に乗ることは無理だろうな。
246 :
デフォルトの名無しさん :2009/06/20(土) 23:04:22
メンバ変数を「フィールド」だって。 ぷっはずかしっ。クライアントの前では使うなよ。
クライアント(笑)
248 :
デフォルトの名無しさん :2009/06/20(土) 23:06:07
この流れを見れば
用 語 す ら ま と も に 使 え な い 連 中 し か い な い
スレであることは一目瞭然です^^
>>230 はちゃんと謝ってるけど。w
249 :
230 :2009/06/20(土) 23:07:11
250 :
デフォルトの名無しさん :2009/06/20(土) 23:07:34
C#やjavaのプログラマにはこのように 些細な間違いを指摘されると 自分の間違いを認めず、他人の人格を否定することに終始する とても程度の低い連中しかいないことがわかります。
251 :
デフォルトの名無しさん :2009/06/20(土) 23:08:28
C#厨は他人に命令するのが好きなようです。
ほぼ誤解のない用語の意を汲めない硬直した思考のデキソコナイがいるようだな。
メンバとかフィールドとかいうC++に存在しない単語を使ってるようなやつの意見は
情報としてまったく価値がないよね。
つまり
>>228 にはまったく情報価値なし。
ものごとの価値は受け手によって違う。 「豚に真珠」とはよく言ったものだ。
久々に見たら何だこの荒れ具合www もういいよ! 頼むから標準C++用語を使って会話してくれ。 初心者なら標準C++にない用語でもまあ仕方ない。おk。 でも初心者じゃないと思うなら規格書にあるような標準C++用語にしてくれ!
>>253 おまえ何でそこまで必死なんだよ・・・
何か嫌なことがあったんなら相談に乗るぞ?
引くに引けなくなっただけだから、優しくしてあげて
頭が可哀想な人は精神科に連れてってあげましょう
259 :
デフォルトの名無しさん :2009/06/20(土) 23:52:24
いや、フィールドとかメソッドとかわけわかんない単語を使った上に 他人をバカ呼ばわりするような連中には優しくされたくないんで。キモい。
>互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに プライベートなメソッドってなんだよ。 プライベートなフィールドってなんだよ。 C++にはそんなもん最初からねーよw ないものにはアクセスできないし問題にもならん。
フィールドとかメソッドがわけわかんない単語とか言ってる言語適応能力の無いバカは、無理に回答側に回らなくていいから。ひっそり静かにしてろ。
262 :
デフォルトの名無しさん :2009/06/20(土) 23:55:42
フィールドとかメソッドがわけわかんない単語を使ってる仕様適応能力の無いバカは、無理に回答側に回らなくていいから。ひっそり静かにしてろ。 ゲラゲラゲラゲラゲラ
涙拭けよww
ここの回答者はC#厨、と。メモメモ
適切な回答ができるなら誰が答えたっていいよ。
>>261 規格書とスレタイ、どっちを読んでないのかな?
ねぇどっち?
C++の規格票にフィールドとかメソッドって単語あったっけ? 記憶にないなあ
他の言語にC++と同様の機能があって別の名で呼ばれていることがあるよ。 たとえばフィールドならC++のメンバー変数、メソッドならメンバー関数とか。 プログラミング言語をある程度知っていればこの程度の読み替え・解釈はそんなに難しくないよ。 すぐにできるようになると思う。
269 :
デフォルトの名無しさん :2009/06/21(日) 00:11:54
C#厨やjava厨はC++の勉強するときはいったんC#やjavaの知識捨てろ。 別の言語の概念を持ち込むな。アンドリューハント先生もそう書いてるだろが。
他人の言葉を解釈しようとするのはコミュニケーションの問題だ
少なくとも、非標準の用語を使っておきながら >馬鹿じゃね。読み替えろよ。 などといえる立場じゃねーわな。 馬鹿なのは間違いなくおまえだ。
違う用語を引っ張り出してくる人の話は8割差し引いて聞いとけばいいってばっちゃが言ってた
273 :
デフォルトの名無しさん :2009/06/21(日) 00:23:59
非標準の用語を使っておいて 「馬鹿じゃね。読み替えろよ。」とか「誤っていない。命令しているだけ。」とかいう奴らに コミュニケーション能力があるとは到底思えんが?
スレ違いの用語を使う奴も、スレ違いの話を続ける奴もどっちもどっちだな 似た者同士もう少し仲良くやれ
相手のミスを揶揄したつもりが馬鹿呼ばわりされて琴線に触れたのか。 お互いもう少し言葉を選んだ方がいいな。おれも自省・・・
揶揄したとか、もう少し言葉選べや。 揶揄したんじゃなく、そんな言葉はC++にないから ちゃんと説明してくれってこった。 なぁ、回答者は初心者じゃねぇんだろ? このC++回答者の仮面をかぶったC#厨めらが。
誰か次の質問してくれ(>_<)
俺の美貌に免じて落ち着いてくれ、お前ら。
もう召喚するなwww
283 :
デフォルトの名無しさん :2009/06/21(日) 06:06:32
C++標準にない言葉使う奴は回答すんなよ。 相談者が戸惑うだろ。迷惑なんだよ。 C++とC#の違いもわかってないから そんなキモい言葉使うんだろうし。
>>268 >プログラミング言語をある程度知っていれば
その程度の理解でC++語るな。
なんだこのスレ、フィールドとメンバ変数の違いを説明してあげれば済む話じゃないのか? 言語の違いとかいうレベルじゃない、存在そのものが全く違う、 これを初心者にわかりやすくするために同じだと言って説明すると後で大変なことになる そこを説明してあげたら?
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
待て! 俺の知り合いはJava大好き厨だがC++も使えて、 そいつがC++の話をする時はちゃんと標準C++用語を使うぞ。 ・・・要するにJava厨が悪いんじゃなくて標準C++用語を使えないヤツが無能。
本日のまとめ: メソッド関数、フィールド変数といえばどっちも満足
同じだよ アセンブラで見てごらん メモリに確保してるだけだよ
>>290 その言い訳、
もう無理ありすぎだろww
どんだけ苦しいんだよ。
>>290 間違ってないが正解でもない
お前人と話しててもすぐ会話が終わるタイプだろ
日曜ぐらい楽しもうとかいう考えはないのか
まったくおまえらはすぐ概念と実装を混同するんだから 「メッセージパッシングなんて所詮ただのメンバ関数呼び出しだろ?」 とか言っちゃうタイプ
C++は実際そうだから仕方ない はっきり言ってメッセージという言葉は混乱を招くだけで邪悪
一人で混乱してろ
そんなこと言わずに一緒に混乱しようぜ
のびてると思ったらおまえらは… あと「メンバ変数って言え」って言ってる人、「メンバ変数」じゃなくて「データメンバ」です 他人の用語の曖昧さを許容するならする、許容しないならしないでその辺ちゃんとしてくれ
たしか直訳じゃなくて日本語標準は変数関数で合わせようで統一されたはず
「曖昧」なんじゃなく、「概念が違う」。 用語間違ってるやつは、ここ勘違いしないように。
>>298 少なくともjisのC++規格ではデータメンバだな
お前ら・・・
>>278 の美貌がボコボコじゃないかwww
というキャラ設定が、恥かいてダメージ負った君の心を癒してくれるわけね。
JISではデータメンバで統一してある。 吉川邦夫はちゃんとデータメンバって書いてた。 浜田真理はメンバ変数と書いてた。 メソッドとフィールドはうちにある本をざっと見た限りではひとつもない。
>>299 まぁ確かに概念は違う
でも、データメンバとフィールドはC++のクラスとJavaのクラスくらいには互いに置き換えて認識することが可能だと思うけどね
c++使いが全員フィールドを知っている訳では無かろう。 疑似問題引き起すから用語には注意しなさい。
概念とか言ってる馬鹿は、blueと青は違うとか言って英語の授業中に暴れてたんだろうな。
「プライベートなフィールドにメソッドを使ってアクセス」とか、C++スレで平気で書くアホは絶やすべき。
C#厨がメンバ変数を知らなかったのが発端じゃないのか?
>>307 C++ユーザ全員が「随伴関数」を知ってるとも思えないけどねw
用語が分からなかったり誤謬があるんじゃないかと思ったら聞けばいいじゃん
…と思うんだけど
オブジェクト指向言語についてあまり知識の無い
>>229 がトンチンカンな書き込みをしたのが発端
JavaのクラスとC++のクラスを似たようなものと見るのもやめてくれ。 それはC++でC流儀のプログラムを組むくらい危険だ。 Javaのインタフェースやファイナライザといったものの存在や すべてのメソッドが何らかのクラスのメンバであるといった特性が C++とのプログラミングスタイルの大きな違いを生んでいる。
>>313 はJavaとC++に類似性を見いだせないアホ
>>228 C++標準すらわかっていないくせに
>互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
>それじゃ何の解決にもならんだろ。
「俺、オブジェクト指向のことすごく良く知ってるんだぜ?」
みたいな上から目線で書いてるのが問題。
フィールド?メソッド?
C++の基礎から勉強しなおしてください。
316 :
デフォルトの名無しさん :2009/06/21(日) 18:15:58
どんな言い訳をしても、フィールドとメソッドがC++の標準的な用語でないことは事実ですから。
なんだ。上から目線で書かれてそんなに悔しかったのかw
で、フィールドとメンバ変数の違いって何?
仕様書を見てみたが、data memberとmember functionって用語で使われてるのか ついでにJavaもざっと調べてみた Fields, which are the class variables and instance variables of classes (§8.3), and constants of interfaces A method declares executable code that can be invoked, passing a fixed number of values as arguments member (class, interface, field, or method) ここはC++と違う Methods and fields may have the same name, since they are used in different contexts and are disambiguated by different lookup procedures(8.4)
321 :
デフォルトの名無しさん :2009/06/21(日) 18:23:07
>>318 「データメンバ」ならC++の規格票に精密な定義が載っているが
「フィールド」はC#のそれなのか、Javaのそれなのか、あるいはほかの言語のそれなのか、
何の定義もないので、どういう機能なのかははっきりしない。
フィールドに特殊なアクセス手段が提供される言語もあるし、
フィールドの命名規則が独立している言語もある。
単にカプセルかされたデータをそう呼ぶだけかもしれない。
いやここで出てきたフィールドはメソッドと対だから
まともなコミュニケーション能力がある人間ならば 「フィールドはデータメンバーのことですね?そうならば〜ですよ。」という受け答えができるんだけどな。 もっとも、コミュニケーション能力があってもオブジェクト指向言語の知識があまりなくて フィールドとメンバー変数が類似の機能であることがわからない初心者には難しいか。
全員流れの理解が中途半端だからまったくかみ合ってないあほすぎる
誤爆
javaのフィールドと比べてなら メンバ変数は大体似たような物、と言っても良いとは思うが データ構造が違うものは別物だろうよ 例えばjavaのフィールドはインタフェースの定数も含む用語だが C++にはそもそもインターフェースがない インターフェース的に使えるクラスはあるが
328 :
デフォルトの名無しさん :2009/06/21(日) 18:33:34
メソッドという単語もたいがい曖昧で、
本来はクラス内にカプセル化されていることを意味しているはずなのに、
グローバルなメソッドが存在する言語もある。
ここでは、メソッドは単に「関数」の意味だ。
メンバ関数もfriendな非メンバ関数も、普通のグローバル関数も
すべてメソッドということになる。
議論が曖昧になったときに決着させるためには
用語の統一が重要であることは、ISOやJISの存在を考えるまでもない。
質問者が適当な用語を使うのは仕方がないが、
>>228 のように、他人の過ちを指摘しようとするなら、
最低限、そのくらいの分別はわきまえるべきだろう。
くやしいのうwwwwwくやしいのうwwww
>>228 は「俺はお前らよりオブジェクト指向がわかってるんだから、C++殉教者のカスどもは俺の言うことを聞け」といってるにすぎない。
病院行けよ。
フィールド、メソッドという言葉を使うなといってるやつは オブジェクト指向がわかってない、もしくはコミュニケーション能力がない。 C#厨はこういいたいそうだ。 こいつらに何を言っても無駄だ。w
ていうか、言葉の使い方さえ正しければ こういう流れにもならずに済んだわけよ。 それだけでも正しい言葉を使う大切さがわかる。
オブジェクト指向の知識があまりない人には読み替えは難しいんだよ。
必死で顔真っ赤になってるひと多いの?
まぁ相談室だからな。 初心者相手には正しい用語(というと語弊はあるが、教科書に載ってそうな用語)を 使ってあげた方が親切だとは思うな。 質問が終わった後で回答者サイドで雑談する分には伝われば何でもいいと思うけど。
まあ、読み替えられる程度の用語は、読み替えて解釈すればいいってことだね。 「この言葉はC++の用語じゃないから使うな!!」なんて騒いで暴れるのはもってのほか。
>>332 そろそろデータメンバをメンバ変数と言い換えた理由を聞こうか?
----------------------------------------------------------------- ここまで自作自演
まったく読み替えできないので、JIS規格に反する用語を使うのはやめてください^^
わからないことがあれば、適宜質問すればいいよ。 みんな親切に教えてくれると思う。
質問したくないし、親切な人は全員ヤクザなのでいやです^^
まだ続いてたのか・・・
このネタであと3年は続けるつもり
せめて3日で終わらせてくれ
明日のこの時間には終わるでしょ
フィールドとかメソッドとか使う奴は池沼。
誰かkusakabe呼んでこいよ。
こわがりすぎー
boost::serializationを使ってシリアライズしようと思っています。 ライブラリなどの自分以外が書いたクラス(例えばboost::gregorian::dataとか)をシリアライズしたい時、 どうすればいいのでしょうか?
353 :
352 :2009/06/21(日) 21:11:53
×data ○date でした
>>352 フィールドとかメソッドとか使うといいよ。プ
あるところにフィールド君という人がいました。
「
>>230 フィールド→メンバ変数
読み替えて。」
と、言いました。
でも、どちらも間違えでした。
本当はデータメンバだったのです。
こんなんだからID表示しようぜって話になるんだよな C++にはメソッドなんてありませんとかわーわー言ってるのはvoid信者かっての
C++にメソッドがあってもいいだろとわーわー言ってるのはC#厨ですね
言葉もまともに使えない人たち
じゃあ説明自体をC++でかけ そうすれば問題ねーだろ?
>>355 この方法もシリアライズできるのはpublicメンバだけですよね?
privateメンバに関しては、1つずつgetしてファイルへ書き込み、ファイルから読み込んで1つずつsetしかないんでしょうか?
そもそもgetter/setterがなかったらファイルへの読み書きは不可能になってしまいそうな・・・。
極論を言い出すアホ出現
>>361 ああ確かに。。
説明文にもそう書いてあるね。
こっそりヘッダにfriend仕込むみたいな邪道な方法しか思いつかない--;
>>357 > C++にはメソッドなんてありませんとかわーわー言ってるのはvoid信者かっての
「C++にはメソッドなんてありませんとかわーわー言ってる」人なんていません。
よかった、かわいそうなvoid信者はいなかったんだ
美談
try { throw new exception(); } catch (exception* e) { delete e; } と try { throw exception(); } catch (exception& e) { } ってどっちがいいの?
下。 キャッチした例外オブジェクトは普通いじらないから const exception& で受けるとよい。 上はキャッチされないとリークするのでダメ。 また、newするときにbad_allocが飛ぶかもしれない。
throw MyException(); として、MyException型の一時オブジェクトのコンストラクタが例外をスローした場合、 二重例外になってしまいますか? それともMyExceptionのスローは中断されて、そのコンストラクタが投げた例外だけが有効になりますか?
>>371 ありがとうございます。コンストラクタで例外がスローされても一応大丈夫なのですね。
>>372 コンストラクタの例外スローは大丈夫
デストラクタの例外スローは駄目
と覚えておくとよい
適当な理由がないと覚えられない
Modern C++ Designでも読めや
いやこの場合は例外に対する問題だから Exceptional C++ の方が良い
C++をやってみたいのですが、 C言語の知識は必須なのでしょうか? C++から始めるというのは厳しいですか?
問題なし。
メソッドとかフィールドとか使わなければ問題ない。
>>377 全然問題無し
C++の仕様の巨大さに萎えると思うが、少しずつ覚えていくしかない
>>379 C++にはメソッドもフィールドもないから
>>381 もっとオブジェクト指向を勉強しましょう :-P
ありがとうございました。 参考に書籍を買いたいのですが、 やさしいC++で良いですかね?
C++にメソッドとかフィールドとかないとオブジェクト指向について理解できなくて萎える
ロベールのC++入門講座がいいんじゃない? あまりの厚さに一瞬躊躇するかもしれないが 内容はとても平易
え、議論なんて誰かしてたの?
>>385 だったら理解するな
>>387 お前のような頭のコチコチに固い馬鹿が吠えてただけかもしれんけどな
さすがにいきなり禿は厳しいか
オブジェクト指向について理解ができず、コミュニケーション能力のない人は フィールドとかメソッドという単語に拒否反応を示す。
ありがとうございます。
>>388 のスレでも一度聞いてみます。
C#やjavaのプログラマにはこのように 些細な間違いを指摘されると 自分の間違いを認めず、他人の人格を否定することに終始する とても程度の低い連中しかいないことがわかります。
>>391 そうじゃなくてさ、ここはC++スレなんだから、C++の規格票にない
言葉を使うのは少なくともやめようぜ
395 :
387 :2009/06/22(月) 01:02:41
え、ちょ、何でROMってた俺が吠えられることになってる?
>>389 は議論(?)してたの?
ってか、どう見ても議論じゃなくね?子供のけんかかよっていう。
ここ別に規格ガチスレじゃないんでしょ?じゃあ伝わればそれでよくね? 確かに違和感は感じるけどさ、それを指摘するわけでもなく、そんな言葉はありませんとか 陰湿だわ。 「じゅうふくしてます」→「そんな日本語はありません」 そう返すか?って話じゃないのー
C#やjavaのプログラマにはこのように 些細な間違いを指摘されると 自分の間違いを認めず、他人の人格を否定することに終始する とても程度の低い連中しかいないことがわかります。
俺は別にC#やjavaのプログラマではないよ。それらの言語を使うことはあるけれど。 でも、もしかするとC++を使うプログラマのことをC++のプログラマと表現することが規定されているのかもしれない。 C++のプログラマの中には、規格で定義されている言葉以外を用いた議論をすることができない 融通の利かない方がいるのだなあということを知りました。
>>397 で、データメンバをメンバ変数と言い換えた理由は?
>>398 そこ
「融通が効かない」と言わない
「厳密に話を進める」と言え
各々が勝手な用語を使い始めると収拾がつかなくなるし
もしかしたら違う意味で使っているという事態が生じるかもしれない
そういう由々しき事態を防ぎたいのだ
>>399 単なるコピペなので俺じゃないよ
>>383 > C++はC#でもJavaでもありません
当たり前ですね。そして何の意味も持たない返しです :-P
なんだKusa○abeか C++を理解できないCしか能のない○usakabeか 放置だな
>>400 なんで命令されてんだ?
俺は融通が利かないなあと思ったからそう書いたのに。
ともあれ、相談者に対して、厳密に話を進めてほしいかどうかを問わずに、
それを強いるのであれば、テンプレに「正しい用語以外を使った質問には回答しません」と書くべきじゃないかな。
そうしないとまた議論することになっちゃうし。
>>402 C#厨というキャラ設定にすがる人もいれば、
Cしか能が無いというキャラ設定にすがる人もいて、面白いですね。
まぁ、好きなように逃げて下さい :-P
是非は別として、通りすがりの俺から見ればこんな事に100レス近く費やしてる時点でどっちもどっち。
不毛だし、その辺でやめといたら?
用語は誤解の元にもなるからキッチリしてるのに越したことは無いけどね。
指導員として新人教育する時はその辺りキッチリ調べてからやるのは当然のこと。
40人の前では不用意な一言が大きな不利益を生む時もあるかも知れんしね。
とはいえ、ここ2chだしなw。一番大事なのは正確性よりスレの雰囲気に合わせることだろw。
>>399 データメンバとメンバ変数なら誤解の起きようがないうえ、そう書いてる書籍もあるらしいし、
そこの指摘は単なる屁理屈だと思うな。そこまで言うならカタカナ使わずに英単語使えば?
俺もそう思うんだが、C++にはメンバ変数というものはないので、きっちりした人から見れば その書籍は窓から投げ捨てるべきだろうし、由々しき事態を招く可能性があるため、それが 何を指しているかの確認をすることもなく、会話をすべきではないと言われている
悪書は存在するが、 そんなものに配慮する必要はない
データメンバーと呼ぶことにしたのは、定数もメンバーになるかららしいね。
一応、nonmember variableという言い方なら仕様にある C++/CLIの仕様だと普通にmember variableは出てくる
novemberにみえた 11月の変数とかなんか詩的じゃね?
413 :
デフォルトの名無しさん :2009/06/22(月) 17:40:20
>>399 >228 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 20:36:49
>
>>219 >
>>221 >互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
>それじゃ何の解決にもならんだろ。
と、書き込んだバカが
>230 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 22:32:34
>フィールド→メンバ変数
>メソッド→メンバ関数
>
>読み替えて。
>249 名前:230[sage] 投稿日:2009/06/20(土) 23:07:11
>
>>230 は誤っていない。命令しているだけ。
と、命令したからじゃないか?wwwwwwwwwwwwwwwwwwwwwwwwww
>>228 は二重に間違ってる大バカ野郎ってことだな。
で、どこにデータメンバーなんて書いてあるんだ?
こんどは、「データメンバ」と「データメンバー」か?
418 :
デフォルトの名無しさん :2009/06/22(月) 21:48:25
未だに、フィールドとかメソッドって使うのが正当だと思っているバカがいるのか? 死んだほうがよくね?
Modern C++ Design はデータメンバ「ー」、 Effective C++はデータメンバになってるが、 これは別に問題じゃないだろ。 フィールドとメソッドなんて単語を使っている C++の本は一度も見たことないがな。
>>413 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
421 :
デフォルトの名無しさん :2009/06/22(月) 22:08:25
データメンバをフィールドと呼んだ上にメンバ変数と言い換えろと命令していた
>>228 から連絡がありません
200近くもくだらない議論に使ってたのか。
いや、そうじゃなくて、
(
>>399 )データメンバをメンバ変数と言い換えた理由は?
に対して、
(
>>413 )が引用している
>>228 ,
>>230 ,
>>249 のどこにも「データメンバ」という言葉がないのだが?
どこにデータメンバーなんて書いてあるの?
データメンバよりメンバ変数のほうが一般的に使われているね。 どちらも正しいC++の用語だし、どちらかが正しくないなんて事もない。 このスレにはメンバ変数がC++の用語でないと思っているバカがいるようだが。
425 :
デフォルトの名無しさん :2009/06/22(月) 22:20:28
>>423 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
データメンバとメンバ変数の議論は 百歩譲ってまあ許せるとしても フィールドとメソッド この表現だけはもうどうしようもない。 庇いようがないほどに。
くだらねぇ議論wwww
>>425 フィールドをメンバ変数と言い換えたんだろ?
どこにデータメンバーなんて書いてあるの?
431 :
デフォルトの名無しさん :2009/06/22(月) 22:39:37
>>430 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
433 :
デフォルトの名無しさん :2009/06/22(月) 22:47:53
何だ、君の本の話か。じゃあいいや。
434 :
デフォルトの名無しさん :2009/06/22(月) 22:48:36
>>433 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
>>431 フィールドをメンバ変数と言い換えたんだろ?
どこにデータメンバーなんて書いてあるの?
まだやってんのか 本当におまえらはバカですね
437 :
デフォルトの名無しさん :2009/06/22(月) 22:50:52
>>435 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
>>437 フィールドをメンバ変数と言い換えたんだろ?
どこにデータメンバーなんて書いてあるの?
クラスのメンバーの変数を「メンバー変数」と読んでも通じない馬鹿と会話するなんて無理
ちなみに、クラスのメンバの変数を「フィールド」と呼ぶバカと会話するのも無理です
昔から普通にメンバ変数っていうけどな。通じるから別にいいじゃん。そういう日本語なんだし。
データメンバをメンバ変数なんて呼ぶのは メンバ関数をファンクションメンバと呼ぶのと同じ 意味は通じなくもないが誰からも相手にされない
ちなみに、データメンバをフィールドなんて呼ぶのは 何かにたとえようもないので、誰からも相手にされない
Javaを知っていれば、Javaではクラスのメンバの変数を「フィールド」と呼ぶことくらいすぐわかるよ。 C++しか知らないと難しいかもしれないけど。 よほどの馬鹿じゃなければオブジェクト指向言語を少しくらいかじっていればJavaの用語くらい知ってるだろ。
必死にデータメンバとメンバ変数の話に摩り替えたがってる奴がいるな。
重要なのは↓だから。
>>228 >
>>219 >
>>221 > 互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
> それじゃ何の解決にもならんだろ。
こいつの「解決」とやらも見てみたいが。
C++の世界ではフィールドというのはビットフィールドしか意味し得ないからな
よし!
じゃあみんなでこうしよう。
>>215 から俺のこのレスまでを全部あぼんし、
フィールドが気にくわない人はフィールドをあぼんし、
メソッドが気にくわない人はメソッドをあぼんし、
メンバ変数が気にくわない人はメンバ変数をあぼん
すればよい。
これで解決。
そうしよう!
>
>>444 何を言ってるんだ
Javaのクラスに「メンバ」なんてものは存在しない
あるのはメソッドとフィールドだけだ
JavaもC++も知らないくせに無理すんな
>>444 ほとんどの人はよほどの馬鹿じゃないので、
「C++」相談室でフィールドとかメソッドなんて言葉は使いません。
よほどの馬鹿でもない限り、javaのスレではjavaの用語を、
C#のスレではC#の用語を使います。
451 :
デフォルトの名無しさん :2009/06/22(月) 23:03:43
メソッドという単語は、Smalltalkが発祥?
使わないやつは使わなければいい。 理解できないやつは回答しなければいい。 以上
>>442 function member はストラウストラップ氏の用語集に載ってる。
「member function を参照せよ」としてだが。
おー、なんか参考になるなぁ。
昔は普通にメンバー変数って言ってたよな。 データメンバーなんて言い出したの最近だろ?
何かこう・・・凄く引っ張るなこの話題
>>455 1998年に作られた標準C++規格には「データメンバ」しかありません
メンバ変数などという意味不明の造語が公式に使われたことはないし、
もちろんC++0xのドラフトにも影も形もありません
「メンバ変数」などという言葉はこの世のどこにも存在しないんだ
いい加減に現実を見ろ
オブジェクト指向言語で一般的に「メソッド」と言われているものをC++では「メンバー関数」と言っているだけだから、「メンバー関数」は「メソッド」に違いないよ。
>>453 >>442 はそれを言っているんでしょう。
ひっくり返すな、と。
>>455 うちの本はさほど最近の本でもないけど、データメンバと書かれているよ。
>>457 の世界には1998年以前は存在しないようだな。
ご愁傷さま。
>>451 恐らく。デザインパターンの金字塔であるGoF本は
C++とSmalltalkを使っているので、
二つの言語の用語がごちゃ混ぜになるアホがいるのかもしれない。
しかし、この本の末尾に載っている用語集には
ちゃんと呼び名が違うことが書かれている。
(両者はオペレーションという概念で統一されている)
>>460 1998年以前の公式文書に「メンバ変数」という記述があるものが存在するの?
何に載ってるか教えてくれよ
>>457 どこにもないわけでもないよ。C++の中にはないけれど。
>>458 C++でメソッドというと別のものになっちゃうから。
これに関してはmethodを単にメソッドと訳してしまった方にも落ち度があるんじゃないかと思わんでもないけど。
>>457 メンバー変数 の検索結果 約 229,000 件中 1 - 100 件目 (0.89 秒)
山のように存在するが?
>>464 そんなの根拠にならん、ただの間違いだ
どうしようもないアホが世の中に呆れるほど多いと言うことの説明にしかならん
完壁 に一致する日本語のページ 約 398,000 件
おまえらリアルでもそんなに細かいの? 新人のK君が「ワーニング」とか言っても我慢しちゃうよ俺 指摘すんの面倒だし
プログラミング言語C++第1版、第2版、ARMが見てみたいんだが。
それはただの読み方の間違いだからな データメンバーをメンバ変数だのフィールドだのという0点な間違いとは訳が違う
ウォーニンが出ました、とかそこだけ変に流暢に言われても困るしな
>>466 その新人くんが「読み替えろよ、バカ」と先輩の君に言ってくるわけだ。
さらに、「これは命令だから」と言ってくる。
わーにんぐで意味がわからないのは
おまえにコミュニケーション能力がないからだ、とね。
原理主義者と変わらんな。
>>465 「メンバ変数」などという言葉はこの世のどこにも存在しないんだ
↓
メンバー変数 の検索結果 約 229,000 件中 1 - 100 件目 (0.89 秒)
↓
そんなの根拠にならん、ただの間違いだ
この世に含まれる「googleの結果」に存在するのだから
「この世のどこにも存在しない」ということが間違いであることの根拠になるだろ。
それともgoogleの結果はあの世のものとでも言うのかね?オカルトか?
>>472 書き間違えるアホが40万人いようとも、「完壁」なんて言葉は存在しない
いくら恥を重ねたってない所から言葉は出てこないんだよ
474 :
デフォルトの名無しさん :2009/06/22(月) 23:23:30
>228 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 20:36:49
>
>>219 >
>>221 >互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
>それじゃ何の解決にもならんだろ。
>230 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 22:32:34
>フィールド→メンバ変数
>メソッド→メンバ関数
>読み替えて。
>232 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 22:37:54
>
>>229 >馬鹿じゃね。読み替えろよ。
>249 名前:230[sage] 投稿日:2009/06/20(土) 23:07:11
>
>>230 は誤っていない。命令しているだけ。
原点に返るぞ。問題は
>>228 のこの一連の発言。
トヨタの「ホームページ」とか言うと怒り出して、日産の「HP」なんて書いた日にゃ顔を真っ赤にして怒鳴り散らす。 そんな馬鹿が少なからずこのスレッドにいる。
>>475 「ホームページ」は正しいWeb用語だ
使い方を間違ってるだけ
「HP」もしかり
「メンバ変数」という言葉はそもそも存在しない
正しい使い方すらそもそも存在しない完全な架空の言葉
悪意のない用語の混同とは一線を画す
>>473 OCRでも使わない限り、意図的に入力しない限りそんな言葉は出てこない。
意図的に入力しているのだから明らかに存在する言葉。
無いはずのものが、目の前にあるのだと思うなら、病院へ行ったほうがいい。
メンバ変数は存在するし誤解なく使用できる言葉。 メンバ変数という言葉が通じないようなど素人と話をしても仕方ない。
479 :
デフォルトの名無しさん :2009/06/22(月) 23:29:19
普通にメンバー変数って使うけどな メンバー変数という言葉が存在しないとか言ってる奴って何なの?アホなの?死ぬの?
用語について議論したい人は、どっかにスレ立てて移動してくれないかな。
481 :
デフォルトの名無しさん :2009/06/22(月) 23:30:04
フィールドはC++の標準規格にないばかりかC++では一般的にも使用しない言葉。 フィールドという言葉を平気で使うようなど素人と話をしても仕方ない。
だから何度言ったらわかるんだ C++のクラスが持てるのは「メンバ関数」と「データメンバー」だ 「メンバ変数」なるものをC++のクラスが持つことは出来ない そしてJavaのクラスもSmalltalkのクラスも「メンバ変数」なるものを持つことは出来ない 「メンバ変数」とやらの概念を含むプログラミング言語は存在しない 歴史や経済やスポーツの世界で俺が知らない意味を持ってるなら話は別だが 少なくともコンピュータの世界に「メンバ変数」という言葉はどこにもない
な…何だこのくだらなさは
484 :
デフォルトの名無しさん :2009/06/22(月) 23:34:25
メンバ変数という呼び名については大して異論はないと思うよ。 一人わーわーわめいている人がいるみたいだけど。 例えば、C++ Coding Standardsではどうどうとメンバ変数という単語が使われている。 恐らく、ほとんどのC++プログラマにも通じる。 しかし、フィールドとメソッドなどという単語を堂々と使っているC++の本は見たことがない。
要は、「メンバ変数」って誰が最初に言い出したのかってことだよな。 英語でも member varialable はたくさんヒットする。
C++以外のオブジェクト指向言語に詳しくない人はあまり無理しなくていいよ。 Javaのフィールドとか知らなくても、べつにC++のプログラミングでは困らないし。
488 :
デフォルトの名無しさん :2009/06/22(月) 23:37:59
R.マッサーのSTL標準テンプレートライブラリによるC++プログラミング第2版でも メンバ変数という単語がデータメンバの意味で使われている。 ほかにも探せば、名著の中にメンバ変数という単語が出てくるだろう。 ところで、さっきから、実際に本を調べて書き出しているのは俺だけだな…。 JIS規格とISO規格を調べてくれたのは俺じゃないが。 何はともあれ、フィールドとメソッドはない。
>>485 member variableをメンバと訳しちゃったんだから従うしかないじゃない、という言い分だと思うよ
>>484 C++ Coding Standardsなら、原著ではちゃんと"data member"という言葉を使ってる
"member variable"なとどいう記述はざっと見る限りは一つもない
訳した奴がアホなだけだろう
2001年くらいからこの板にいるけど、 C++の話をするときに「メンバ変数」という言葉を使って 「そんなものは無い」って返されたことは一度もないなぁ。
>>491 2001年には、いわゆる「ゆとり世代」ってのがあまりいなかったからな。
空気読めない質問ばっかりして呆れられてたんじゃない?
>>491 そんなこと言うのは昨日あたりからこのスレで暴れてる馬鹿しかいないから
496 :
デフォルトの名無しさん :2009/06/22(月) 23:43:09
ああ、Exceptional C++でもメンバ変数って単語を見つけた。 同じくデータメンバの意味で利用している。 メンバ変数は普通に勉強しているC++プログラマには通じるだろう。 何度も言うが、フィールドとメソッドはない。
過ちを正すのに遅すぎるということはない 今まで勘違いしてた人たちも、メンバ変数なんて言い方はやめて これからきちんと「データメンバー」って言うようにすればいい これでいいだろ?
データーメンバーじゃなくていいの?
499 :
デフォルトの名無しさん :2009/06/22(月) 23:46:14
>>490 >訳した奴がアホなだけだろう
恐らくはそうに違いない。
メンバ変数がC++標準規格の用語でないという事実を争うつもりはない。
重要なことは「フィールド」や「メソッド」などという単語は登場せず、
規格票にもでてこないから、「フィールドをメンバ変数に読み替えてくれ」といったところで
結局どちらも間違っているということだけだ。
データメンバでもデータメンバーでもデーターメンバーでも何でもいいよ どれも"data member"という正しい用語の正しい読み方だ メンバ変数はどういじくり回しても正しくはない
「data member」って書けばいいじゃん。 読むときはアメリカンにね。
オブジェクト指向言語についてある程度の知識があれば フィールドとメソッドという言葉はJavaとC++の類似性から理解できるよ。 理解できなければ無理に理解する必要はないけどね。
>>500 もうわかったから。お前ん中では正しくないんだね。
>>502 C++のクラスのデータメンバーとJavaのクラスのフィールドはある点で似ている
それは確かにそうだろう
しかしだからといってC++のフィールドだのJavaのデータメンバーだの、
ましてやメンバ変数などという言葉の使い方が正しいことにはならない
>>505 >それは確かにそうだろう
じゃあもういいんじゃね。
>>503 ISO/IECが策定した世界標準規格です
>>505 まぁ落ち着いて、文末に句点つけろよ。
お前の言葉の使い方は間違ってるよ。
よほどの馬鹿でないかぎり C++相談室 で、Javaの用語を使った上に、 人をバカ呼ばわりしたりはしない。
バカ呼ばわりされたのが悔しかったのね。
おまいらいい加減にしろ こんな下らんことを延々と言い争いしたいなら他でやれ
多分他に話題がないからなんだろうね。 この状況みると相談する気もなくなるだろうし。相談する言葉を選ぶのが大変そ。
>>507 規格はもうわかったから。
メンバ変数って言葉も今回でちゃんと覚えておけよ。
メンバ変数だのフィールドだのというアホ丸出しでしかも間違った言葉を 執拗に使いたがるアホが粘着してるのがいけないんです
>>514 お前こそそんな間違った言葉は忘れてデータメンバーって言葉を覚えた方がいいぞ
>>507 あと、C++のメンバ変数、メンバ関数は、Javaのフィールド、メソッドに対応するよ。
せっかくだから覚えておくといいよ。
>>517 C++のメンバ関数がJavaのメソッドに対応するのはいいけどね
何度言ったらわかるんだろ
Javaのフィールドに対応するのはC++のデータメンバー
C++にメンバ関数というものはないし、当然Javaのどんなものとも対応はしない
>>517 つまりJavaにフィールドという言葉はないということか
C++にメンバ変数がないとか言ってる奴って、馬鹿なの?素人なの?死ぬの?
>>521 だって、実際にないんだもん
規格のどこを探してもそんな言葉はない
そろそろ諦めてくれよ
>>516 別に忘れる必要はなくて、
普通は、規格の用語と慣用表現と両方覚えておくほうがよりいいと思う
C++のスレでフィールドとかメソッドとか平気で使ってる奴って、馬鹿なの?素人なの?死ぬの?
C++にメンバ変数があるとか言ってる奴って、馬鹿なの?素人なの?死ぬの?
ちなみに、慣用表現でもC++にはメソッドとかフィールドなんてものはありません。
>>526 そのへんはJavaの類推でわかるからいいじゃん
「慣用表現」って詰まる所「俺様表現」だろjk
>>527 俺Javaなんて糞言語やらないからわからないや
オブジェクト指向言語で一般的に使われるメンバー、メソッドという用語を知らないことがばれて、よほど悔しかったんだね。 でも、C++ではメンバー変数、メンバー関数って言葉になってるから、それだけ知っていればC++を使う限りは問題ないよ。 オブジェクト指向言語に詳しい人と話すときにはちょっと困るかもしれないけど、でもそんなに気にすることないよ。
慣用表現をどこまで受け入れるべきかの線引きは確かに難しい。
結構広まっちゃった表現なら「俺達表現」ってとこで
>>529 君はJavaのことなんて気にしなくていいよ。C++だけで大丈夫。無理しなくていいよ。
C++では使わないフィールド、メソッドという用語を平気で使っているってことを指摘されて、よほど悔しかったんだね。 オブジェクト指向言語に詳しいとか思い込んでるだけのバカと話す必要はないからまったく困らないね。
>>530 そのレスが皮肉のつもりであれば、そのレスにおいてはデータメンバと記述すべきであった。
実際、データメンバーなんて言ってるやついない。メンバー変数って言ってる。
言っておくが、GoF本ではちゃんとメソッドとメンバ関数を使い分けてる。 まともな本は用語と概念は切り分けてるから、ごっちゃになる方がアホだと思う。
オブジェクト指向で一般的に使う言葉ということであれば、 例えばUMLのクラス図ではC++のデータメンバー、Javaのフィールドに対応するものはプロパティと呼ぶ
慣用表現だから受け入れろよ、という人は、サブルーチンという言葉も躊躇いなく受け入れるのかな
>>537 だが、それは間違いだったんだ
明日からは胸を張って「データメンバー」って呼べばいい
間違いを正すことに恥じることはない
用語もマトモに使えないって、どんなマヌケなオブジェクト指向本を読んだんだろうな。 ぜひ書名を教えてほしいもんだ。地雷を踏まなくてすむ。
JIS原理主義者キモチワルイな JISだけが規格じゃないのになんでそんなに有り難がっているのか意味不明
結論。 フィールドとかメソッドとか、C++のスレで使うな。キモイ。
JISの大本のISO規格の時点で"data member"で統一されてます "member variable"なんて言葉は出てきません ところでISO以外のC++の標準規格って何?
548 :
デフォルトの名無しさん :2009/06/23(火) 00:25:19
>228 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 20:36:49
>
>>219 >
>>221 >互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
>それじゃ何の解決にもならんだろ。
C++のスレで「メソッドやフィールド」だって。プ
>230 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 22:32:34
>フィールド→メンバ変数
>メソッド→メンバ関数
>
>読み替えて。
C++標準規格には、メンバ変数なんて言葉もないから。プププ
必死すぎだろw
リターンキーがなくなり、エンターキーが台頭した頃、エンターキーのことをリターンキーという人がいた。 今もリターンキーって言っているのかな。 リターンキーと言われても違和感はないですか? virusのことをかつてビールスと発音していました。 今もビールスといっている人はいるのかな。 ビールス対策ソフトと言われても違和感はないですか?
最近C++を始めた連中はメンバ変数って言葉知らんのかー 時代が変わったのう
俺3版だからイマイチついていけてないのかもしれん。
553 :
デフォルトの名無しさん :2009/06/23(火) 00:30:57
____ / \ /\ キリッ . / (ー) (ー)\ <「もっとも、コミュニケーション能力があってもオブジェクト指向言語の知識があまりなくて / ⌒(__人__)⌒ \ フィールドとメンバー変数が類似の機能であることがわからない初心者には難しいか。」 | |r┬-| | \ `ー’´ / ノ \ /´ ヽ | l \ ヽ -一””””~~``’ー--、 -一”””’ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー’´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l バンバン ヽ -一””””~~``’ー--、 -一”””’ー-、 ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
>>551 一部の人がデータメンバーのことをそう間違って呼んでることなら知ってますが
間違いは間違いです
よかった、俺はプレステのことをファミコンと呼称していなかった
そもそも「知ってる・知らない」と「適切である・適切でない」がごちゃ混ぜになってるのは何でなの? 煽るために意図的にやってんの? 「○○という言葉の使用は適切でない」という発言に「○○を知らないのか」的なレスするのは全部煽り?
最近も何も10年も前の規格からデータメンバーはずっとデータメンバーなんだけど
まあ、朝鮮人が発酵してないキムチはキムチじゃないって火病って騒いでるだけだろ。 発酵してなくても日本ではトウガラシの入ってる白菜の漬物をキムチと呼ぶし、クラスのデータメンバーのことをメンバー変数とも呼ぶ。
>>553 それが言われて一番悔しかった言葉なの?wwww
561 :
デフォルトの名無しさん :2009/06/23(火) 00:37:22
>>559 で、データメンバをフィールドと言い換えた上に、
さらにメンバ変数と言い間違えた理由は?
>>558 そうか、お前朝鮮人なのか
さっさと祖国に帰りなよ〜
データメンバーもフィールドもメンバ変数も同義語だろ。 ゴチャゴチャ騒いでるバカって何なの?
564 :
デフォルトの名無しさん :2009/06/23(火) 00:40:26
>>563 同義じゃないから困るんだ。
メンバ変数という言葉がある世界にはメンバ定数という言葉もありますか?
一人で困ってろ馬鹿。
>>561 で、正しく用語を使えと言いながら
自分も"メンバ変数"が正しいと思い込み、
ずっと指摘せず放置していた理由は?
570 :
デフォルトの名無しさん :2009/06/23(火) 00:42:38
>>568 ____
/ \ /\ キリッ
. / (ー) (ー)\ <「もっとも、コミュニケーション能力があってもオブジェクト指向言語の知識があまりなくて
/ ⌒(__人__)⌒ \ フィールドとメンバー変数が類似の機能であることがわからない初心者には難しいか。」
| |r┬-| |
\ `ー’´ /
ノ \
/´ ヽ
| l \
ヽ -一””””~~``’ー--、 -一”””’ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / //
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー’´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||l バンバン
ヽ -一””””~~``’ー--、 -一”””’ー-、
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
>>556 > 煽るために意図的にやってんの?
まぁ基本はそう。
相手に少しでも大きな歯軋りを立てさせるには
どうやって逆撫ですればいいか、を追求してるの。
>>563 まあ、「類義語」ではあるかもな
そして、プログラムの世界で似て非なるものに対して雑に同じような扱いをすると
ほぼ確実にタチの悪いバグを埋め込むことはよく知ってるだろう
同義語でない類義語の区別は厳密でなければならない
それが似てれば似てるほどな
YAGNI
>>556 そういう事
言ってる事は百も承知だが相手に出来るだけ悔しい思いをして
顔を真っ赤にしてキーボードを叩いて欲しいわけですハイ
プログラミング言語でプログラムを組んでいるのではなく、自然言語でコミュニケーションをしているのだから 疑問があれば都度聞けばいいし、誤解があることが分かれば後から解決すればいいだけのことなのに XXは違う、OOは言うななんていうのは見当違いも甚だしい。
データメンバーを無邪気に「メンバ変数」だの「フィールド」だのと呼んでる人が改心してくれればそれでいいです 間違いは仕方ない、明日から直せばいい 異様に抵抗してる変な人が若干いるみたいだけど
データメンバー()笑
メンバー変数は普通にC++用語だし、フィールドはJavaからの類推でメンバー変数だとすぐにわかる。 C++しか知らないと難しいかもしれないけど。
>>579 分かってるけど知らない振りしてお前を煽ってんのよ
なんだ、分かてるならいいんじゃね?
582 :
デフォルトの名無しさん :2009/06/23(火) 00:57:56
まだメンバ変数が正しいC++用語だと思ってるの?
class hogeとhoge(int i)というのを定義して forループの中で for() { hoge h(1); } と呼び出すとオーバヘッド大きいですか?
>>583 C++でフィールドなんて言葉を使っちゃうような人は標準規格なんて聞いたこともないからしょうがないんだよ
>>579 いやさお前があまりに簡単にファビョるので面白くてつい・・・ね
>>585 うるさい。今大事な話の最中なんだ!
・・・荒れているので、ほかのスレで質問してください。おながいします。
突然メタな話題をしだして「俺は冷静なんだぜ」のアッピールが笑えるw
>>585 hoge(int i)の定義次第だけど普通は重いと考えて避けるだろうな
顔真っ赤にして火病ってるのはどうみても C#厨が〜て連呼してるアホだろ。
お前らこの調子で1000までいっとけよ 明日の朝までにな
どんな荒地でも一日立つと何事も無かったかのようになる おまえらの忍耐力はどこまでもつかな?
>>590 どうでもです。
内部でnewなんか連発してると目も当てられないですよね?
>>591 >228 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 20:36:49
>
>>219 >
>>221 >互いにプライベートなメソッドやフィールドへアクセスすることが問題なのに
>それじゃ何の解決にもならんだろ。
どうみてもどちらも間違いです。
>230 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/20(土) 22:32:34
>フィールド→メンバ変数
>メソッド→メンバ関数
>
>読み替えて。
メンバ変数も標準規格にないことが判明しました。
本当にありがとうございました。
>>589 ああそうか、自分には到底できない冷静なレスがムカついた時には
そういう噛み付き方もあるのか。
>>594 目も当てられないほど遅くなったら出せばいいよ
大抵は目にもとまらない速さなんじゃないかな
メソッドが駄目ならアクセッサやゲッター、セッターも駄目なんですね。
クラス内で宣言される enum は規格中で専用の用語があてられてないようなんだが、 これを「メンバ enum 」と呼ぶと間違いだと言われるんだろうか? 間違いだとすれば、どう呼べば正しいと言うのだろうか?
最新のドラフトには "member variable" あるね。ライブラリについての記述にしか無いけど。
列挙子とかよくかかれてるように思うけど規格では書いてないんだ?
ん、クラス内限定か なんだろね?w
勢いおちてるぞい
ゲハと見紛うばかりの高尚な煽り合いの最中に、こんな低劣な質問をするのは大変恐縮なのだが…。 親子関係にあり、相互参照しているオブジェクトに対して、子オブジェクトの部分集合を削除したいとして。 最初は erase(remove_if(first_children, last_children, pred)) を思いついたんだけど、 これだと子→親の参照を切断できないから、仕方なくforループを使った。 その後で、ふと「predの中で切断したらよくね?」とか思いついたんだけど、 たとえ手元の実装では動作することを確認できたとしても、 述語に副作用があるのはやっぱりまずいよね?
>>606 余計な工夫を考えず、一番ベタな形でforループ書くのがいいと思う。
今からC++やるならC++/CLIの方がいいんでしょうか? 入門書とかぜんぜんないんですがいつからこの言語が出来たんですか?
クロスDLL問題を最近知りました。 C++の規格に未定義動作と規定されているのでしょうか? なぜ根本的な解決をしないのでしょう。 なぜ他の部分は互換性を取ったけど、そこだけ非互換にしておくのでしょう。
言語の規格と何の関係もないから
>>609 C++/CLI の主な目的は .NET 系技術と C++ の資産を相互運用だから、
.NET と C++ の内、少なくても一方を経験してないと厳しい。
特に学習の障壁となりやすい、ポインタやメモリ周りが特殊なので、
まずは C++ と STL を利用したコンソールアプリあたりで学習を開
始した方が良いと思う。
最終的にはCLIまでやるべきなんでしょうか アセンブラと組込CとCOBOLは出来ます どんどん積み重ねていかないとだめだとするとどんどんハードになると思うんですが 時代が進むにつれて勉強しなくてもいい部分がパッキングされていってる新し言語じゃないってことですか?
意味不明。 C++とC++/CLIは全くの別物
>>613 >勉強しなくてもいい部分がパッキングされていってる新し言語じゃないってことですか?
C#でしょう、
616 :
610 :2009/06/23(火) 19:53:22
shared_ptrもクロスDLL問題の為にデリータをサポートするわけでしょ?
クロスファイア
>>610 C++の規格は言語の解釈を定めてるだけであって、
どういうバイナリを吐いてどう実行させるかは処理系の問題
DLLというものが存在しない処理系があっても全く問題ない
619 :
610 :2009/06/23(火) 21:18:53
DLLであろうと何だろうと規格どうりキチンと動くようにならないのは なぜなのかっておもって。
きちんと未定義
だから名前マングリング位規格で決めとけとあれほど
まったくだ。 あと、extern "C"よりもうちょっとマシなCとのインタフェースを 決めなかった点もどうかと思うんだが。
ゆくゆくはいろんなextern "XXX"であらゆる言語と接続!という野望のために決めた構文らしい 結果は知っての通り
>>623 究極的には、C++の側をいじらないでも、CからC++のライブラリを使えるとうれしい。
例外処理があると、がんばっても無理っぽいが。
#ifdef __cplusplus extern "C"{ #endif #ifdef __cplusplus } #endif お決まりのこれを見るたびに絶望的な気分になる
プリプロセッサで書き換えればいいんじゃね?
Mintクラスの特定のメンバ関数だけがMoneyの作成を許可されるようにしようとしています。 そこで以下のようにfriend指定したところ、CreateMoneyはprivateなのでコンパイルエラーとなりました。 では、friendの範囲をできるだけ狭くしたまま、目的を達成するにはどうすればいいですか? よろしくお願いします。 class Money; class Mint { Money* CreateMoney(); // private }; class Money { friend Money* Mint::CreateMoney(); // error Money() {} // private }; Money* Mint::CreateMoney() { return new Money; }
629 :
デフォルトの名無しさん :2009/06/23(火) 23:50:26
以下のように定義した関数のように、引数をカッコでくくるのはどんな意味があるのですか? template<class T, std::size_t N> std::size_t count_of(T (&array)[N]) { return N; }
参照の配列か配列の参照かの違いじゃね。
>>630 配列の参照は()を付けて宣言するのですね
ありがとうございました
>>628 Mint に friend class Money; するんじゃ不満だってこと?
633 :
628 :2009/06/24(水) 07:18:38
>>632 とりあえずそれは良さそうな方法ですね。
ただ、MintにはCreateMoneyだけでなく、いろいろなメンバ関数やデータメンバが他にありまして、
それら全部がMoneyからアクセス可能となるのは不満です。
friendの範囲をより限定的にできれば嬉しいのですが。
std __verify_grouping これはなんですか?
if((a = malloc(n*n*sizeof(float))) == NULL) return 1; の部分がエラーになってしまい(line 11 で'int'から'float *'への指定です。:`='演算子) コンパイラできませんでした。 の質問が来てます。 コンパイラーは何ですか?
>>636 斬新な質問だな。
とりあえずそのエラーメッセージのパターンは見たことないからわからない。
てきとうにぐぐっても、宿題スレの元質問しかヒットしなかった。
>>628 ,633
class Money のインターフェースを抽象インターフェースクラスに抽出して、
その実装を Mint の private や Mint::CreateMoney() のローカルに置く。
やりたいことはこれで済むんじゃないの?
コンパイラーは何ですか? こっちが聞きたいよw
>>636 >コンパイラできませんでした。
とか、もしかして日本人じゃない?
VC++とVB間のプロセス間通信について聞きたいんですが、ここであってますでしょうか? 自分なりに調べてみたんですが、いまいち詳しいことが載っているサイト、書籍が見つから なかったので、何かお勧めのサイト、書籍ご存じないでしょうか? 今のところ、VCで画像認識、VBでマイコンの操作できるものがあり、この2つを連携させたいと 思っています。自分は、画像認識を主にやっているので、VC側である程度汎用性をもたせて、 他のプログラムとも連携させたいと考えています。
>>641 VCからVBを操作するのは困難
VCでdllを作成し、VBからそれを使用するのが簡単
どうしても別プロセスにしたいなら
ファイルマッピング もしくは ソケット
をキーワードにググる
Win32にパイプあるじゃん 手元にある本を見ただけでもプロセス間通信にはDLLを使った 共有メモリ、名前付きパイプ、メールスロット、ファイルマッピング などいろいろある
VBのバージョンは? VB6だとシングルスレッドでないとVBが超不安定になって直ぐ落ちるから、マルチスレッド必須のAPIやフレームワークはムリゲ そんで,ソケットオススメなのは2PC間でやってもソースがそれほど変わらないから
>>636 #define NULL 0
って書いた馬鹿者を突き止めてさらし首にすれば
解決する気がする。
namespace NS { class sample {} } このように、クラスの定義の終わりの 閉じ括弧}の後ろにセミコロン;を付けるのを 忘れることが良くあるのだが、 そうするとエラーメッセージがgccで expected unqualified-id before '}' token となる。 和訳すると トークン}の前にunqualified-idがあるはずなのにありません。 だと思うのだが このエラーメッセージのunqualified-idってなに?
class sample {} hoge; って書いたときのhogeがないって意味じゃないか?
>>649 ああ、なーるほど。
そう解釈する訳か。
そんな書き方したことないから忘れてたわ。
652 :
628 :2009/06/24(水) 21:03:09
653 :
636 :2009/06/25(木) 00:01:55
コールバック関数の意味がいろいろ調べても良く分かりません。 何で使う必要があるのでしょうか? 誰か教えてください。
調べて分かる知識と 実践で分かる知識がある
>>655 一番分かり安い例えがqsort()
あれがWin32で多用されていると思えばよい
なるほど理解は不文律なのですねわかります
>>657 qsortの例だと利用価値分かるのだけど、
仕事で見ているソースで使われているコールバック関数の意味が分からず。
スレッドで呼び出すとか書かれているけど、呼び出す関数なんて一つだし
何でわざわざこんなことしてんだか分からん。
>>659 相互参照を断ち切るためじゃないかな。
AがBの関数読んでてBがAの関数読んでたら
お互いがお互いのことを知ってないといけないけど
コールバック関数を使えば
どちらか一方がもう片方を知っていれば済む。
なるべく早くコールバック関数を理解して、
コールバック関数を使うべきところで使ってない人には
システム設計とかさせない方がいいよ。
661 :
636 :2009/06/25(木) 01:57:21
>>659 スレッドで呼び出すのが前提なら、バックグラウンド処理のためじゃないの?
時間乗っかる処理を裏で走らせて、その完了をコールバックで知らせ手もらうとか。
何十にも複雑に入れ子になった構造体が あるのですが(20kbyte) これを何度もmemcpyでコピーするとすげー 時間かかります。助けて
気のせいです
>>663 >何十にも複雑に入れ子になった構造体
だから遅い訳じゃないよそれ
きっと再帰的にmemcpyを行っていると予想
memcpyしないプログラムに書き換える
そんな複雑な構造体をmemcpyよりも早くコピーする方法なんて思いつかない
何を...
>>668 君、君が何を言っているのか分かんないよ
べつにだいじなことじゃないので繰り返さなくていいです
ただの代入とmemcpyだとどんぐらい違うんだろ
実測で大差なかった。
operator()をvirtualにするのは規格的に合法なのでしょうか?
もちろんOKよ。 規格としてvirtualにできないのはポンストラクタだけ。
ポンストラクタ・・・愛媛のまじめな初期化です
チンポストラクタ・・・白子製造機です
>>675 ありがとうございます.
デストラクタって無能なんですね^^
>>672 memcpy()を使うと最適化が阻害されている可能性がある。
構造体コピーにすると rep movsd rep movsw movsb とやってくれたが memcpyはchar単位のコピーなので rep movsb みたいなコードだった 俺様コンパイラの場合
movs?系ってそんなに高速だっけ。
>>681 かなり。リピート回数が1/4になるのにバスアクセス回数は変わらないからね。
memcpyの方が遅い可能性なんて考えたことなかったわ 勉強になるスレだなぁ
>>680 それは、構造体が固定長だからじゃ。
>memcpyはchar単位のコピーなので
普通は、以下のようにしそうだが。
movsd * size/4 + movsw * (size%4/2) + movsb * (size%4%2/1)
>>684 あんたの言う「普通」はあくまでも一例。例えば>680のような実装もあるし、
iccのようにSSEを使った専用memcpy()に置き換えてしまう場合もある。
処理系の最適化とライブラリの実装によるってことかね。 自分の処理系がどうなってるのか気になるなら、 自分でテストコードでベンチとるしかないね。
アセンブリ出力を眺めるだけでも判ると思うが。
688 :
659 :2009/06/27(土) 10:32:45
>> 660 662 アドバイスありがとう。 ただ、プログラムは正常に動いているし、処理も高速だし 自分の理解が足らないだけだと思う。 スレッド、サーバー、ソケットとかのクラスがあって、 サーバクラスの中には「クライアントにメッセージ送信」 とか書かれてたり。全体像や関係がさっぱりわからん。 ネットワーク使ってるわけでもないし。カメラ使っているからそれが 関係するのかしないのか・・・。 これらの言葉からおよその全体像って推測できますか?
サーバースレッドとクライアントスレッドの通信にlocalhost接続つかってんじゃね?
690 :
659 :2009/06/27(土) 11:58:09
>>689 確かにコメントとかコードを眺めているとそんな感じに思えるのですが、
そうだとしたらどういうメリットがあるんでしょう?
もっとシンプルに出来そうな気がするのですけど。
BSDソケットなら移植性がありメッセージキューイングを自前実装しなくて済む。 スレッド間通信をプロセス間通信、ネットワーク通信に拡張するのも簡単。 パケットサイズがバカでかいとかじゃなければ、大概の場合でベターな手法だと思うがね。
692 :
659 :2009/06/27(土) 16:53:43
>>691 BSDソケットでなくwinsockを使っているようで、
2つのプロセスがあって1つがサーバでもう一つがクライアントのようです。
2つのプロセス間でデータをやり取りするのってこういう方法が
普通なんでしょうか?
一般的に言って、 例外処理って重い? …………………………………………………… MyClass foo(){〜〜} try { foo(); 正常動作時処理 } catch(const EXCEP&) {エラー処理。} …………………………………………………… このようにfoo()内部でエラーが発生した場合に例外EXCEPクラスを投げてすぐ後ろでキャッチするのと …………………………………………………… boost::optional<MyClass> foo(){〜〜} boost::optional<MyClass> x = foo(); if(x) {正常動作時処理} else {エラー処理。} …………………………………………………… このようにfoo()内部でエラーが発生した場合にboost::optionalで対処するのと どっちが早いんだろう?
重くない
>>694 速度は実測が基本。
一般的に、っていう話で言うと、実行時型情報を含む catch ハンドラの検索があったり、
コンパイラの最適化の対象として優先度が下げられていたりするんで、他の分岐手段より
重いことが考えられる。
速度は実測が基本とか言ってる奴は馬鹿だから気にしないほうがいい
俺も実測厨だったんだが、 速度が変化しまくるんで何回か計った平均でいつも出してた でも1回目とそれ以降って全然違ったりするんだよな キャッシュたまったんじゃね?って先輩に言われたよ・・・
速度を複数回実測して平均値を出すのに 簡単な方法ってありますか?
足して割ればいいんじゃね?
クソワロタw
C++を始めた時は「動けばいいや」 その後はまり始めると「何でもかんでもクラスにしてやるぜ」 今、俺は 「正確に動いてインターフェースが使いやすければ、 関数でもクラスでもどっちでも良いじゃん」 っていう心境になってきたんだが、 これでもいいかね?
2つの関数作って、順番に呼び出してそれぞれの時間を計ったことがあった。 最初計ったときは、2つ目の関数の内部処理の方が速かった。 でも、順序入れ替えたら新しい順序でも2つ目の方が速かった。 実測はアテにならんね。
関数とクラスは対立概念ではない
707 :
703 :2009/06/28(日) 23:29:57
知らなかった。ごめん。
>>704 関数1個め実行後のメモリのキャッシュの状態とかによって実行時間なんて簡単に変わる
ある処理の実行時間なんて簡単に計算できるものではないし、
単純に比較できるものでもない(だからこそ実測する)
キャッシュに惑わされない正しい実測の方法ってどんなのだ?
実測厨は一生底辺で実測してろwwwww
>>709 大きいサイズのメモリを使う場合は、あらかじめアクセスしておいて
ページフォルトを起こしておく、とかは常識だろ
アーキテクチャー依存の糞プログラムが出来上がる
条件次第で速度が変わると言うことは、 結局測定しても意味がないと言うことなのでは・・・。
>>707 は いわゆる「かわいそうな人」なので、
余り目くじら立てないで挙げて欲しいな。
知らないことを知らないと正直に言える勇気は認めてあげたい
>>713 少なくともひとつの環境で実測することは、実測しないことよりはるかにまとも。
プログラムに慣れていないなら実測したほうがいいかもね。
そういえば某携帯メーカーでデバッグが遅い遅いってあんまりうるさいので 他社機と比較したら倍以上時間かかっててリーダーが青ざめてたことあったなぁ
実測もせずに速度の話ができるわけないだろ、常識的に考えて。
720 :
703 :2009/06/29(月) 00:16:22
いや、
>>707 は
ただの なりすましちゃん。
全くキモチワリイな。
まあ、ITドカタは計算量のオーダーの話とかしないからな。 まず実測ありきでも仕方ない。そういう仕事なんだし。
サッターさんも、メイヤーさんも実測するのが一番と言ってたよ。
ビッグオー表記は隠された定数Cを考慮しないから やっぱり実測するのがベスト。 サッター先生やメイヤーズ先生だけでなく マッサー先生もそのアルゴリズムが本当に有効かどうかは実測せよと書いていた。 もちろん、ここのカスどもより信じてもいい人たちなので 僕は彼らを信じます
最後の仕上げで実測するのはいいけど まずはアルゴリズムの検討をして、コード上のフローを確認して、 アセンブリコードを検討するのが先 それをせずただ実測を繰り返しても何もならない
「実測が基本」と聞いて「実測しかしない」と解釈したアホが暴れていた、というわけですか。
>>728 で、「実測しかしない」と解釈して暴れているレスはどれよ?
計算量と実行効率は違うでしょう と釣られてみる
たとえOSやライブラリなどのソースが公開されていても実測が一番正確で頼りになる。
あっそ。死ねば。
実測ほど不正確なものはない
プログラム最適化の第一法則:最適化するな。 プログラム最適化の第二法則:まだするな。
三:そのままリリースしろ
四.検収したらあとは別料金
あるあるwww
Cスレで話題になってて気になったのでこちらに。 reinterpret_castとstatic_castはどちらが危険か、という話です。 reinterpret_castの方が危険とするサイトもあれば、逆もあって、よくわからなくなりました。 識者の方の意見をお願いします。
>>740 reinterpret_castはstatic_castでは不可能な型変換(例えばint->ポインタ)を
許すのだから、reinterpret_castの方が危険。
禿本の6.2.7に両者の違いについて書いてあるから読むように。
reinterpret_castの方が危険とする記述はあちらこちらで見られるのですが、
static_castの方が危険とする記述はあまりありません。
そのため、reinterpret_castの方が危険だという認識を持っていました。
ですが、static_castの方が危険とする記述がされているサイトが
個人サイトではなく、MSDNのDeep C++だったので迷っている次第です。
http://msdn.microsoft.com/ja-jp/library/cc440192 (VS.71).aspx
reinterpret_castは何も関係ないものをキャストしてしまう可能性がある static_castは形式を合わせるために余計なことをする可能性がある どっちが危険とかではなくて危険の質が違う
禿がより危険だって言ってるんだからそれでいいだろ。 MSDNの文書のどこにstatic_castの方が危険と書いてある?
> static_cast は C++ の道具の中で最も危険なツールの 1 つであり、ほかのすべての方法でうまくいかないときに限り使うべきである。 と書かれているので、static_castを使う前に、reinterpret_castを試すべきだと読めるのですが
>>743 ありがとうございます。
一概にreinterpret_castの方が危険だとは言えないのですね。
逆に、行うべきではない間違ったキャストをしてしまった場合(バグ)に
気づきやすいのはreinterpret_castであるように思いました。
>>744 >>742 のリンク先に記述されていました。
MSDNの記事を書いたオッサンの主張は宗教染みてるだろ。 禿とこのオッサンどちらを信じるのかと言われたらおのずと答えは出ると思うが。
オッサンを信じよう。
ォィw
ワロタw
reinterpret_castの方が危険だとする禿の理由って、例によって安易に型を変更するなとかそういうアレ?
RAIIを否定するかの様な話しも昔MSDNの記事にあった気がする
サイズ違いのポインタ変数へreinterpret_castカマしたら危険だよね near→farとか
static_castなら安全なの?
static_castなら安全なの?
お、誰かわからんけど、確かに大事なことなので2回目ありがとう
static_castなら一時ポインタオブジェクト生成して型変換も可能だからね
それって安全なの?
static_castが危険なのはダウンキャストの時
reinterpret_castによるダウンキャストは安全なの?
データモデルと関係があるんじゃないか? LLP64 16 32 32 64 64 LP64 16 32 64 64 64 IP64 16 64 32 64 64 ILP64 16 64 64 64 64 SILP64 64 64 64 64 64 みたいな感じで
関係ない
多重継承があるので、さらにややこしくなる。
ダウンキャストするときはdynamic_castで安全なんじゃないの?
ダウンキャストはそれが安全なことをプログラマが保証しなくてはいけない。 その場合でもreinterpret_castでは駄目な場合の方が多いだろう。
static_castはダウンキャストするときに、多重継承のアドレス調整を行うよね? reinterpret_castだと、アドレスはそのままじゃないの?
768 :
デフォルトの名無しさん :2009/07/01(水) 23:37:38
#include <iostream> struct A { int a; }; struct B { int b; }; struct C : public A, public B { int c; }; int main() { C* pC = new C; std::cout << pC << std::endl; std::cout << static_cast<B*>(pC) << std::endl; std::cout << reinterpret_cast<B*>(pC) << std::endl; } を実行したら、こうなった。 0x6f0248 0x6f024c 0x6f0248
reinterpret_cast(何もしない) V static_cast(アドレス調整するだけ) V dynamic_cast(インスタンスのチェック&アドレス調整、ただしクソ重い) の順に危ない
クソ重いってどれくらい? O(n!)くらい?
クソがつくぐらいだからO(pow(n, n))くらいじゃね?
そんなに重いんじゃ使えないな。dynamic_castだめじゃん。
ネタにマジレス O(n!)もO(pow(n,n))もどちらも(数学的な意味では)正しい
数学的にどちらも正しいとは?
O(n!)〜O(pow(n,n))だから
つまり、dynamic_castが使い物にならないってこと
こういうのは、C++の設計の悪さだろう。 Cのstructをそのままclassに拡張したと言うところに無理があった。 最初はよかったが、その後泥縄状態。
まあO(n!)までは行かないにしても 普通の実装ではvtblにクラス名の文字列持ってstrcmpだからな 連発するには重すぎる
普通の実装って凄く便利な言葉しってるんですね
連発するんだ
>>777 それを言い出したらあらゆる不満が噴出するだろ
C#でおk
>>777 ちなみに、どんな拡張なら無理がないの?
windows+eclipse3.5で開発してクロスコンパイル→linux(i86)実行ファイル で作成したいのですが、 ツールチェーンはcgywinでは間違ってます? 調べるとcgywinでできるようなんですけど .exeしか生成されない…てかg++でコンパイルしてるかどうかも・・・
>>779 普通というか、細かい工夫はあるにせよ基本的にはそうするしかないから
C++に限ったことじゃなく実行時型を扱う言語はみんな同じ
JavaにせよC#にせよRubyみたいなLLにせよ
>>783 C/C++みたいな言語でdynamic_castを必要とするプログラムを書くこと自体がそもそもの間違い
>>786 つまり、C++の設計は悪くないってことだよね
ビヤーンストラウストラップ氏は、 後方互換性にこだわりすぎじゃないだろうか。 ある程度で妥協して、あとは extern "C" みたいに、 extern "C++98" とかじゃダメなのか。 とっとと新言語をつくって、 extern "C++" でC++の 資産を使えるようにしとけばよかったのではないか。
C#があるじゃないか
>>768 それ知らなかった、勉強になった
reinterpret_cast怖いな
ManというクラスがTimpoというメンバを持っている場合、 Timpoのコンストラクタより先にManのコンストラクタを呼び出すにはどうすれば良いのでしょうか。
どうすればも何もかならずManが先に呼ばれるぞ Manのコンストラクタの中でTimpoのコンストラクタが呼ばれる それ以外の方法はない
あ、Timpoが静的メンバでない場合の話な
dynamic_castはtemplateハッカー御用達なイメージ Lokiとかboostとか
>>788 だめだ
それではカスみたいなD言語にすら負けてしまう
>>790 何もしない(Cのキャストと変わらない)ことを知ってれば
static_castより安全でわかりやすい気もする。
Cのキャストはstatic_castみたいに動いたりreinterpret_castみたいに動いたりするので その言い方は語弊がある
具体例を
double a; に対し、(int)a はstatic_castと同じで、(int*)&a はreinterpret_castと同じだよね? A* a; で (B*)a するとどうなるの? reinterpret_castと同じ?
AとBが継承関係にあるならstatic_castと同じ。 無関係なクラスならreinterpret_castと同じ。
>>800 ありがと。じゃ
>>796 もちょっと違うのか。やっぱりC形式のキャストは使うもんじゃないな。
だというのにC++形式のキャストを1文すら載せないC++本がある
そういやstatic_castって経由キャストのは完全手動なのかな int 要求に operator unsigned 適用されたり long long に operator int 適用されたりする部分の規格ってあるの?
const_castがうざい時Cスタイルキャストを使うのは俺だけでいい
貴様一人でも許さん
const_cast<const char *>(static_cast<char *>(const_cast<void *>(p))) とかやるたびに絶望的な気分になる
const_cast<const char *> は確かに絶望的だね
C++は、完全に静的型付けで多重継承をやろうとするから、 キャストがめんどくさくなってるんじゃないかね。
それはない。
流れをぶった切る初心者の質問ですみません。 class list { public: list *next; list *getnext() { return next; } } で p->getnext() と p->next が等価であることが理解できませんが、なにかいい説明はないでしょうか。
等価じゃないよ。 p->getnext()は左辺値にならない。 list*& getnext() { return next; } だと、かなり近いが。
class CHoge
{
public:
int a;
int get_a() { return a; }
}
CHoge hoge;
hoge.a と hoge.get_a() が同じ(実際は
>>812 の言うとおり違うが)ってのは分かるん?
それと全く同じ
>〜が同じ(実際は〜違うが)ってのは分かるん? どっちだよwwwわかんねーよwww >それと全く同じ それってどれだよwwww
816 :
815 :2009/07/04(土) 02:32:51
>>811 取得するときは変わらないだろうね。
逆に、代入するときを考えてみるといい。
等価という言葉がよくない。 あとは、関数(メソッド、サブルーチン、手続き)というものを分かっているかどうか。 returnって何か分かってるか。
インライン関数にして左辺値に代入して使うなら多分同じ? 通常の関数の場合は、スタックにでも一度積むのかな、ここの動作がイマイチよく分からない。 返値がvoidの関数と、bool型でも何でも返値を持っていても使用しないというのでは、 やっぱり返値を使用しない方では関数から戻った後も無駄な動作が入るのかな。
何を求めてるのか知らんが、さっさとアセンブリでも見ろよ。
>>812-813 の説明を言い換えると、こう。
p->nextは変数に直接アクセスしてる。
nextそのものだから、値を取り出し、また代入できる。
list *getnext() { return next; }はnextの保持する値をコピーしている。
list*型の一時変数が作成され、そこにnextが保持するアドレスがコピーされ、返されている。
値を取り出すことはできるが、一時変数に代入しても意味がない。式の終わりとともに破棄されるから。
ポインタは単にアドレスという種類の値を保持しているだけで
それ以上でもそれ以下でもない。参照とは違う。
>>811 aとbが「等価」とは
!(a < b) && !(b < a)
が真であること。
よって、
p = new list();
であれば
( !(p->getnet() < p->next) && !(p->next < p->getnext()) ) == true
であるから、
p->getnext()とp->nextは等価であるといえる。
「等価」であることに左辺値かどうかは関係ない。
等価月憚
826 :
811 :2009/07/04(土) 13:27:19
>>813 提示していただいたこれは理解できます。
おもうに、ポインタにまどわされたのかもしれません。
p->next と書いたとき、next がオフセットを示している、というイメージが邪魔をしていたようです。
>>817 ,
>>818 ,
>>819 多分大丈夫だと思います。
クラステンプレートの例示コードで悩んでいました。
皆さんコメントありがとうございました。
>>822 はい。多分p->next とかいたときに、next がオフセットを示唆しているという間違ったイメージが邪魔していたようです。
イメージを修正して読み直したところ、ちょっとだけですが理解できました。
828 :
デフォルトの名無しさん :2009/07/09(木) 17:59:25
どこがわからないのかを説明するべき
>>828 君の知識の知識のレベルは?
つーかネタ?
本気で聞いてるとは思えないな。
C++使ってOpenCVとかはある程度いじってるんだが とりあえずinclude <vector>とかはしてみたいんだけど vectorとかは認識されていない識別しとかになっちゃうんだよね だから自分で定義しなきゃいけないんだろうけどどう定義すればいいのかがよくわからないです
あ,↑828です
うーんと、つまりOpenCVライブラリはともかく 標準C++の知識は0に近いって事? ・・・でもなんかこのリンク、 C++の知識の問題じゃなくて 画像処理の知識の問題な気がしてきた。
834 :
デフォルトの名無しさん :2009/07/09(木) 19:13:21
>>831 たぶんネームスペースなんだろうな。
using namespace std;と最初に書いてみるとか。
835 :
828 :2009/07/09(木) 19:27:27
using namespace stdはかいてみましたがそれだけではだめでした. いろいろとグローバル変数とか構造体が定義されていそうなのですが それぞれがどんなかんじの意味なのかがよくわかりません
元ネタのPoisson image editingとやらは動かせてんのか? クラスとかはそっちのソースで定義されてんだろ
エラーメッセージのコピペもできないこんなレベルじゃ
838 :
828 :2009/07/09(木) 20:43:36
元ネタのPoissonImageEditingは論文形式ではあるのですが プログラムとしてはないと思うんですがあるのでしょうか? ないと思ったから困っているのですが. エラーとしてはこんなかんじのが出てました. 1>PoissonEdit.cpp poissonedit.cpp(18) : error C2065: 'pixel' : 定義されていない識別子です。 poissonedit.cpp(18) : error C2059: 構文エラー : '>' poissonedit.cpp(19) : error C2143: 構文エラー : ';' が '{' の前にありません。 poissonedit.cpp(26) : error C2059: 構文エラー : '>' poissonedit.cpp(26) : error C2059: 構文エラー : ')' poissonedit.cpp(27) : error C2065: 'iter2' : 定義されていない識別子です。 poissonedit.cpp(27) : error C2227: '->y' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 1> 型は ''unknown-type'' です。 poissonedit.cpp(27) : error C2143: 構文エラー : ',' が ')' の前にありません。 poissonedit.cpp(29) : error C2059: 構文エラー : '>' poissonedit.cpp(29) : error C2059: 構文エラー : ')' poissonedit.cpp(30) : error C2065: 'pix' : 定義されていない識別子です。 poissonedit.cpp(30) : error C2228: '.y' の左側はクラス、構造体、共用体でなければなりません 1> 型は ''unknown-type'' です。 poissonedit.cpp(30) : error C2227: '->y' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 1> 型は ''unknown-type'' です。 poissonedit.cpp(34) : error C2228: '.y' の左側はクラス、構造体、共用体でなければなりません 1> 型は ''unknown-type'' です。 poissonedit.cpp(34) : error C2143: 構文エラー : ',' が ')' の前にありません。 poissonedit.cpp(37) : error C2228: '.y' の左側はクラス、構造体、共用体でなければなりません 1> 型は ''unknown-type'' です。 oissonedit.cpp(45) : error C2143: 構文エラー : ';' が '}' の前にありません。 poissonedit.cpp(45) : fatal error C1004: 予期せぬ EOF が検出されました。
>>838 だからpixelっていうクラスだか構造体が定義されてるソース持ってこいよ
それを見せずにおれたちに何を求めてるんだよwww
>>839 いわゆる、ほら、、
えすぱぁ
ってやつじゃないかな?
841 :
デフォルトの名無しさん :2009/07/09(木) 22:16:54
まずはC++のコンパイラを用意するんだ!
C++コンパイラにかけているように見える
STLが使えないのかそもそも自分でヘッダファイルを作ってインクルードする方法を知らないのか
>元ネタのPoissonImageEditingは論文形式ではあるのですが >プログラムとしてはないと思うんですがあるのでしょうか? >ないと思ったから困っているのですが. ええと、俺がバカなのか? 意味がわからんのだが 誰か日本語に翻訳してくれるひといない?
PoissonImageEditingの手法についての論文はあった が、ソースコードは見つからない、だから俺は困ってる 俺の翻訳結果
>>844 元(もと)ネタ(ねた)のPoissonImageEditing(ぽわそんいめーじえでぃてぃんぐ)は論文形式(ろんぶんけいしき)ではあるのですが
プログラム(ぷろぐらむ)としてはないと思(おも)うんですがあるのでしょうか?
ないと思(おも)ったから困(こま)っているのですが.
この程度の日本語なら超エスパーできないと 顧客からヒアリングなどほとんど無理。
質問なんですが、C++のswitch文って中で計算は可能なのでしょうか? switch{ d = a + b; case 〜〜〜 break; みたいに 分かりづらくてすみません 無知なもので・・・(泣)
>>844 どこが分からないのか言えとさんざんこのスレで言われてるでしょ。
>>850 switch(a+b) {
case 〜〜〜
break;
switch(〜) {
case 〜〜〜
d = a+b;
break;
どっちかだと思うけど、どっちも計算できるよ
Quick BasicのSELECT CASE文はCASE文に条件式が書けたけど C++のswitch case文ではcase文にかけるのは(整数の)定数式のみ。
case文に条件式書く状況が俺の拙い想像力じゃ思いつかない
かなり作為的だけど… SELECT A CASE A>3 CASE A MOD 2 = 0 CASE CHAR$( A ) = "A" こんな感じ。 変数Aが3より大きいとき、Aが偶数の時、Aを文字コードで考えてそれが文字”A”に該当するとき… みたいに、おおよそ関連性のない条件で分岐できたりする。 まぁ、わざわざこんなことしなくてもどうとでもなるけど。
859 :
デフォルトの名無しさん :2009/07/10(金) 14:17:07
そういうのって普通 if で書くと思うんだけど
さぁ?それはVB使いなりQB使いなりに聞いてくれ。
そこまでは知らん。
>>856 は
>>850 への回答ってだけだから。
好きにすればいい。
>>839 それがそのサイトやリンク先に見つからないから困ってるんです
862 :
797 :2009/07/10(金) 16:49:03
// pixel.h //このヘッダを作って、includeして、ちょこちょこすればOKです #include <vector> struct pixel; struct pixel { float x, y; std::vector< pixel* > neighbors; }; inline void init_pixels( std::vector< pixel* >& pixels, unsigned int width, unsigned int height ) { pixels.reserve( width * height ); for( unsigned int i = 0; i < width * height; ++i ) pixels.push_back( new pixel() ); for( unsigned int y = 0; y < height; ++y ) { for( unsigned int x = 0; x < width; ++x ) { pixel* up = y > 0 ? pixels[ (y-1)*width + x ] : pixels[ (height-1)*width + x ]; pixel* down = y < (height-1) ? pixels[ (y+1)*width + x ] : pixels[ 0*width + x ]; pixel* left = x > 0 ? pixels[ y*width + (x-1) ] : pixels[ y*width + (width-1) ]; pixel* right = x < (width-1) ? pixels[ y*width + (x+1) ] : pixels[ y*width + 0 ]; pixel* center = pixels[ y*width + x ]; center->x = x; center->y = y; center->neighbors.push_back(up); center->neighbors.push_back(down); center->neighbors.push_back(left); center->neighbors.push_back(right); } } }
サイトの人に聞け。
>>859 一応、どれか1つを実行するという意図が一目で分かるというメリットがある
else ifの連鎖だと、else ifなのか単にif文が並んでいるだけなのか
注意深く確認する必要がある
多態でおk
そこで{}elifですよ
867 :
デフォルトの名無しさん :2009/07/11(土) 11:22:29
クラスのメンバ関数ポインタをメンバにした場合、インスタンスから呼出すにはどうかけばよいでしょうか。 class A { public: void (A::*pFunc)(); } int main() { A a; a.*pFunc(); } だと、pFuncが宣言されていないというエラーがでます(gcc4.0)。 ご教授おねがいします。
(a.*pFunc)()
やってみたけど動かん。 A a; void (A::*p) = a.pFunc; (a.*pFunc)(); はコンパイルできるが。
class A { public: void (*pFunc)(); } int main() { A a; a.pFunc(); }
それはありえん。
「a.pFunc」がメンバ関数ポインタなんだから、それを呼び出すのはこう int main() { A a; (a.*(a.pFunc))(); }
(a.*(a.pFunc))(); と書いたら行けた。 こんな冗長だったっけ。
メンバ関数ポインタを持ってるAインスタンスと、 それを通じてメンバ関数を呼び出されるAインスタンスには関係がないから むしろそう書けないと困る
>>874 なるほど。それで理解できた
#include <iostream>
class A {
public:
char *m_id;
void (A::*m_pfunc)();
A(char *id, void (A::*pfunc)()) : m_id(id), m_pfunc(pfunc) {}
void foo() { std::cout << m_id << " do foo\n"; }
void bar() { std::cout << m_id << " do bar\n"; }
};
int main() {
A a("Alex", &A::foo), b("Brian", &A::bar);
(a.*a.m_pfunc)(); // Alex do foo
(a.*b.m_pfunc)(); // Alex do bar
(b.*a.m_pfunc)(); // Brian do foo
(b.*b.m_pfunc)(); // Brian do bar
}
876 :
デフォルトの名無しさん :2009/07/11(土) 21:20:11
質問ですが、IDとパスワードでログインして、 特定の文字列を抽出するプログラムってどうやって作りますか? ヒントでもいいので教えていただければうれしいです。。 プログラムは全くの初心者ですが。
何にログインするのかとか、抽出元の文字列はどこから来るのかとか、 元々の前提条件の情報が全然足りませんが・・・。
>>876 > IDとパスワードでログインして、
> 特定の文字列を抽出するプログラムってどうやって作りますか?
プログラミングの問題じゃなくてお前の頭がどうかしてるよ。
自分の質問を読み返して見たら?
879 :
デフォルトの名無しさん :2009/07/11(土) 22:13:31
質問です。 タスクトレイにアイコンを表示する方法を調べています。 調べてみたら、Shell_NotifyIconという関数を 使用すればいけることが分かりました。 とりえず、コンパイルだけ通してみようと試しましたが、 うまくコンパイルが通りません。 どうすれば、コンパイルを通せるようになるでしょうか? エラーメッセージが error LNK2028: 未解決のトークン (0A00000F) "extern "C" int __stdcall Shell_NotifyIcon・・・・で参照されました。 error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall Shell_NotifyIconW・・・・で参照されました Shell_NotifyIconを使用している関数の中身は NOTIFYICONDATA notif; Shell_NotifyIcon(NIM_ADD, ¬if); しか書いていません。 環境はVC++2008 Express Editionです。 よろしくお願いします。
881 :
デフォルトの名無しさん :2009/07/11(土) 22:43:53
>>880 分かりました。
他のところで聞いてみます。
882 :
デフォルトの名無しさん :2009/07/12(日) 10:15:49
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) はamazonによると誤字脱字が酷いとか書いてあるけど、 第二版を買った方がいいですか?
今さら第2版なんぞ買ったって役に立たん つーか尼レビューなんか鵜呑みにするなアホ
翻訳が酷いなら原書と照らし合わせて読めばいいじゃない。
原書がさらさら読めるレベルなら 無理してまで読むような本じゃないよ。 第2版のころまではこの本を読まないと手に入らない知識があったけど 今はこの本があまりに有名になったせいで この本に書いてあることは他の本にもたくさん引用されてる。 C++ Coding Standardsみたいに内容が丸かぶりの本もある。
日本語は諦めて原著をさがしてダウンロードして読むことにします。
>>882 いや、原著第3版で良かったよ。
日本語がオススメ。
英語力が相当ある人以外は脳内で翻訳することになるんだから
最初から日本語で読んだ方が良いと思うんだぜ。
C言語の拡張・後継として開発された言語 C with Classes これが改名される時に どうしてD言語じゃなくてC++になったの?
P言語はPascalだろ↓
890 :
888 :2009/07/12(日) 12:03:06
>>889 とするとD言語はDelphiとか?そういうこと?
ホームページでC++の必読ページってどこですか?
google.com
C言語はCOBOL
質問者のくせにタメ口の奴ってなんなの?
回答者のくせに上から目線って何なの?
898 :
895 :2009/07/12(日) 16:31:17
>>896 お気に障りましたら申し訳ございません。
あなた様のお知恵をどうかお貸しください。
>>897 ちょww俺だと誤解されちゃうじゃないかwww
いや、少なくともこういう
>>896 みたいなやつに限っては
口先だけだから敬語は不要だろ。
まぁたいしたお知恵もお持ちでないんだよ 。
例えば君の質問にも答えられないだろうね。
なぜおまえが回答してあげな…いやいいんだ
>>895 動く動く。もしかしたらDLLを連れて行かないといけないかもしれないけど。
902 :
895 :2009/07/12(日) 17:01:07
>>901 ありがとうございます。
アセンブラが混ざっているようで不安だったんです。
>>902 そりゃ対応CPUが心配ならSSEとか一切使わないやつをビルドをすればいい。
904 :
902 :2009/07/12(日) 17:10:25
>>903 左様ですか。
良さそうなのでもうちょっと勉強してきます。
>>896 回答者なら上から目線でもいいけど
回答者ですらないからなぁ。
>>895 とえあえず実際にやってみて動くかどうか試しなよ
2ch初心者なんだろうか。
>>896 のことだよ?
え?ごめん何が何だか分からない。 まあ分かる必要はないか。
わからないくせに上級者気取り(・∀・)クスクス
911 :
909 :2009/07/12(日) 20:13:07
>>910 俺は今日初の書き込みだけど?
何カンチガイして( ',_ゝ`) ぷっ
WinPCap使ってパケットキャプチャーソフト作ろうかなーなんておもってたらサンプルむつかしくて泣いた なんか適当に関数呼び出すだけでパケットの情報が返ってくるとおもってたのに… 何かすっごく分かりやすく解説してあるサイトないかなー
WinSock2ならrawパケットつかえるはず
914 :
デフォルトの名無しさん :2009/07/12(日) 21:06:28
rawパケットとパケットキャプチャってどう関係してるんだ?
えっ
>>913 なんかwinsock2を調べたら例でWinPCapを前提にしてるようなページが出てきたんだけど…
winsock2のほうが簡単なの?
>>913 の言ってるrawパケットってTCPとかのプロトコル部分を
省略したり自分で組み立てられるみたいな話だろ?
>>911 顔真っ赤にしてどうしました?(・∀・)
>>918 え?
もちろん鏡見ながらの言葉のですよね?
921 :
デフォルトの名無しさん :2009/07/12(日) 22:45:11
>>918 ここで仕事の鬱憤を晴らすのやめてくれない?
>>921 まあアンカ付けてるから勘弁してやろうぜ。
まとめてあぼんできるしさ。
C++ code - 32 lines - codepad
ttp://codepad.org/onXi8fpr ここにあるMyIntクラスを改良して
intからMyIntへの暗黙の変換
(変換元のint型の値を変換先のMyIntのメンバmem_intで持つ形)
が出来るようにしたいと思っています。
ただしMyIntクラスの定義自身には手を加えられない状況です。
私としては
キャスト演算子の定義を追加できないかと思っているのですが、
メンバ変数としてでない方法でキャスト演算子は定義出来ますか?
924 :
923 :2009/07/12(日) 23:08:38
つまり本来なら intを受け取るexplicitでないMyIntのコンストラクタを 定義するべきなのでしょうが、 MyIntクラスの定義自身には手を加えられない 状況のため、仕方なく外部の関数(inline指定予定)で定義しよう と思っています。 どうにかなりませんでしょうか?
926 :
923 :2009/07/12(日) 23:44:47
struct MyIntStruct { int mem_int; }; int main() { MyInt hoge; MyIntStruct* mis = (MyIntStruct*) &hoge; mis->mem_int = 10; std::cout << hoge; return 0; }
MyInt::MyInt(int val) : mem_int(val) {}
C++でアドレスを返すにはどうすればいいのでしょうか? 今自分が書いてるソースコードをようやくすると void MyClass::main() { KOUZOUTAI* pUketori; getAddress(pUketori); } void MyClass::getAddress(KOUZOUTAI* pKaesu) { pKaesu = m_pHairetu + 10; // メンバ変数配列の要素11個目のアドレスのつもり } 自分はメンバの配列変数の要素が入っているアドレスを渡す関数を作りたいのですが、 mainに戻ってくると正常な値が入っていません。 メンバの配列変数自体は実体をnewで確保してあります。 もしも内容を返すのであれば *pKaesu = *(m_pHairetu + 10);だと思うので、 pKaesu = m_pHairetu + 10; だとmain関数のpUketoriポインタが該当配列のアドレスを指してくれると思ったのですが 違うのでしょうか?
もうね、何度もいうけど、ポインタっていうのは単なる変数なのよ。 入っている物が、整数でもなく、倍精度実数値でもなく、 単に「ポインタ値」と呼ばれる型情報つきのアドレス値に過ぎないのよ。 いい? それを頭にいれて次の関数を考えてみてね。 void foo( int x ) { x = 1; } int main() { int a; foo( a ); cout << a << endl; } これで、表示されるaの中身が1になると思う? ・・・思わないよね。 引数として与えられた変数の中身をいじりたいなら「参照わたし」これ。
>>929 こんな感じにソースコードを書いたんですが、mainに戻ってくると正常な値が入っていません。
どうしてでしょうか?
void getFive(int num)
{
num = 5;
}
int main()
{
int n;
getFive(n);
return 0;
}
932 :
931 :2009/07/13(月) 12:33:38
ああ神!聖なる糞!
つまり void foo( int &x ) でなければならないわね。 したがって、ポインタの場合も同様で、 void foo( int *&x ) でなければならないのは自明でしょ?
934 :
931 :2009/07/13(月) 12:35:37
>>933 ネタがまるかぶりして申し訳ないところだが、その場合は参照渡しではなく、アドレス渡しの方がよいと思う。
良い悪いの議論をするなら 引数を変更する方式よりも、値を返す方式にしたほうがいいと思う。 いつもそうだってわけじゃないけど。
>>934 確かに。
・・・でもまぁ、このレベルのミスをしている初心者に
ダブルポインタはかわいそうかな・・・みたいなw
938 :
929 :2009/07/13(月) 14:36:47
ありがとうございます。確かに言われて見ればおかしな事をしていたと思います。 ダブルポインタを使うならこういう修正でいいのでしょうか? void MyClass::main() { KOUZOUTAI** pUketori; getAddress(pUketori); } void MyClass::getAddress(KOUZOUTAI** pKaesu) { *pKaesu = m_pHairetu + 10; // メンバ変数配列の要素11個目のアドレスのつもり }
>>938 それはだめ。初期化されていないpUketoriの値を関数に渡しており、その内部でデリファレンス(参照はがし)している。
これは
int* p;
*p = 30;
というコードと同じくらいダメ。
というか、意味も分からずダブルポインタを適当に使ってみても無理。
ちゃんと解説すると少し時間かかるから今から書くけど、その間に他の人に先を越されそうだ。
書けた。
基本的に、「《ある変数》を関数に渡して、関数の内部でその変数の値を変更したい」場合、
関数の引数は《ある変数》を指すポインタ型として、呼び出し元からは《ある変数》のアドレスを渡す。
(ポインタではなく参照を使うのもいいが、まあその話は置いておく。)
例えば、整数を受け取ってその値を変更するような関数を書く場合は
void five(int* num)
{
*num = 5;
}
として、これを呼び出すときは
int n;
five(&n);
のように使う。これくらいの例は見たことがあると思うが、この場合《ある変数》というのは
int型のnという変数だ。だから関数の引数の型はintを指すポインタ型、つまりint*型であり、
関数に渡すのは &n である。
>>929 の例では、《ある変数》に該当するのが、KOUZOUTAI*型のpUketoriという変数だ。
関数の引数 pKaesu の型は、《ある変数》を指すポインタだから、KOUZOUTAI*を指すポインタ、つまりKOUZOUTAI**型にすればよい。(だからダブルポインタが出てくるんだよ。)
関数の内部では *pKaesu の値を設定する。
で、呼び出し元から関数に渡すのは、《ある変数》のアドレス、つまり &pUketori だ。
pUketori の型はKOUZOUTAI*のままでよい。
こういう理屈を分かってないと行き詰まる。
沖林正紀先生の出番ですね
列挙型に定数がいくつ定義されているか知る方法って 実際に数える以外にありますか?
ケツに終端用の定数を加える
こういうことですね enum hoge{A,B,C,hoge_count}; ありがとうございます!
sizeof(hoge)
hogeの要素数でなくサイズだからsizeof(int)とかになる
951 :
デフォルトの名無しさん :2009/07/14(火) 03:28:36
まったく同じ条件でコンパイルした時オーバーフローするときとしない時があるのは何でなんだぜ?
>>951 もう少し詳しく書いてみようか。
・どんなコードを書いた?(可能ならコンパイルできる完全なコードを)
・具体的に、どんな風に実行したら、どのようにオーバーフローした?
・そもそも何がオーバーフローしてるの?(普通は整数変数の値かな……それ以外のオーバーフローもあるよ)
不完全な質問をされるよりも、レスをスルーされるほうが遥かにむかつくのは俺だけ?
おまえは甘やかされて育ったんだろうな
956 :
929 :2009/07/14(火) 13:12:38
>>940 丁寧な解説ありがとうございます。
書き込み内容を参考に勉強します。
C:\aa>bcc32 hello.cpp Borland C++ 5.5.1 for Win32 Copyright ( hello.cpp: Error E2209 hello.cpp 2: Unable to open Error E2282 hello.cpp 3: Namespace name Error E2451 hello.cpp 7: Undefined symb Error E2451 hello.cpp 7: Undefined symb *** 4 errors in Compile ***
>>957 無駄なスレ汚しは止めろ。
何なんだよ?
959 :
958 :2009/07/14(火) 21:20:42
>>957 と思ったらマルチポストか。
消えろヴォケ。
俺の出番だな。
>>957 別のスレに回答しておいた。
a
同名のローカル・グローバル変数や関数が無いにもかかわらず、デフォではメンバを見に行かないのはどういう状況か見当つく人います? スコープ系のディレクティブでも仕込んであるのかしら。それともC++03だとメンバアクセスにはthis必須に?
具体的なコードも書かずにエスパーしろとな
メンバを使おうとしている場所がstatic関数の中だから
すばらしいエスパーだな
いや、テンプレートクラスで継承元のメンバを使おうとしているんだろう
それらしい用語を並べてるけど微妙にずれてるからなあ
"r"が抜けてるぞ
template<typename T> struct Hoge{ 〜 }; こういうクラスで「TがクラスPiyoを継承していたらT=Piyoにする」という風に書きたいんですが、 できるだけクラスや、テンプレート引数を変えずにするにはどんな方法が良いですか?
亀レスで申し訳ない。 >962-964 いや、すまん。知ってたらでよかったんだ。手元にコードないしね。 確認してきたけど、変数も関数もstaticではなかったよ。 汚くて申し訳ないけど、構造としてはこんな感じ。 --------------------------------------------------------------------------- namespace AAA { char val[] = "表示される";} namespace BBB { using namespace AAA; class CLASS { char val[] = "表示されない"; void func(); }; void CLASS::func() { std::cout << val; } } --------------------------------------------------------------------------- 実行結果は「表示される」。ちなみにnamespace AAAとBBBは別ファイル。コンパイラはGCC4.1
>966 あーそれか。テンプレートクラス継承してたような気がする。 ありがとう。 >967 ごめんなさい。勉強はしてるけど片手間だから一向に身に付かん。
> char val[] = "表示されない"; ここの部分、コンパイル通るのか??
どういうこと?
非staticメンバってそんな風に初期化できたっけ。
無理。クラス定義内で初期化できるのは static const int のみ。 コンパイラ独自拡張は知らんけど。
C++0xではできたような
978 :
974 :2009/07/16(木) 17:05:18
ああホントだ、ろくに読んでなかった。 "表示される"と"表示されない"があるのか。 以後読まずに適当にレスしないように気をつけるわ。
誰か、これの危険度について相談に乗ってくれ struct A; std::vector<A*> v; std::vector<const A*>& w = reinterpret_cast<std::vector<const A*>&>(v); 裏で危険な特殊化とかやられていると嫌だけど、やっちまいたい衝動に駆られるのだが・・・。
(v)は(&v)でないと…
MyClassを作ったとして、その実装次第では MyClass::operator=(const MyClass&) で自己代入チェックが必要になります。 しかし、MyClassのコピーコンストラクタでは 代入演算子でいうところの自己代入は起こりえませんよね? 心配しなくても大丈夫でしょうか?
心配しなくても大丈夫です。
コピーコンストラクタはインスタンスを生成する処理だから処理を抜けるまで インスタンスは存在していない。だから引数に自分のインスタンスが渡されることは ありえない。よって自己代入は起こりえない。
>>984 「表示される」の方はclass内じゃないだろ。
ああ、
>>978 は"表示されない"自体に気づかなかったのか
スレ汚しすまんかった
>>979 やっちゃいけないと判ってるのに他に何か考慮すべき事があるのか?
学年に一人は居るよね 火災警報ボタン押しちゃう奴
989 :
981 :2009/07/17(金) 09:12:30
>>979 なんでそんなことしたいのかが分からないんだけど、
const_iterator では不足?
>>979 危惧しているとおりやばいのでやらないほうがいい。
boostってライブラリを使うと簡単にイテレータを作れるから、それでconst A*を返すイテレータを作るのはどうかな?
#include <vector>
#include <boost/iterator/iterator_adaptor.hpp>
class A
{
public:
void test(){}
void testConst()const{}
};
typedef std::vector<A*> VectorA;
class iteratorX :public boost::iterator_adaptor<iteratorX,VectorA::iterator,const A*,boost::use_default,const A*>
{
public:
iteratorX(const VectorA::iterator& aIter):boost::iterator_adaptor<iteratorX,VectorA::iterator,const A*,boost::use_default,const A*>(aIter){}
A* dereference()const{return *base_reference();}
};
int _tmain(int argc, _TCHAR* argv[])
{
VectorA VA;
(*VA.begin())->test(); //エラーにならない。
iteratorX IX=VA.begin();
(*IX)->testConst(); //エラーにならない。
(*IX)->test(); //エラーになる。
VectorA::const_iterator aa=VA.begin();
(*aa)->test(); //エラーにならない。
return 0;
}
javaジェネリクスのextendsみたいなことをテンプレートでやりたいんですが、やり方ってありますか?
>>992 type_traitsをenable_ifもしくはBOOST_STATIC_ASSERTと組み合わせる。
次期改訂のC++0xで、ずばりこういう用途(にも使える)、コンセプトって機能を入れようという話もあったが、
どうやら無くなるらしく、C++0xスレはやや葬式ムード。
>>994 こんな感じに直すんだ。
template <class U>
friend ostream &operator<<(ostream &stream, coord<U> ob);
template <class U>
friend istream &operator>>(istream &stream, coord<U> &ob);
template <class T>
ostream &operator<<(ostream &stream, coord<T> ob)
template <class T>
ostream &operator>>(ostream &stream, coord<T> &ob)
(friend宣言のほうに合わせてTをUにしても構わない)
996 :
995 :2009/07/18(土) 02:26:40
997 :
994 :2009/07/18(土) 02:41:52
>>997 やっぱり
>>995 の両者、宣言と定義でテンプレート引数の名前を統一しないとダメそうだな。
VC++ 9とg++ 3.4.4 (Cygwin)では異なっていてもエラーにならなかったんだけど。
>>997 &がない。
istreamがostreamになってる。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。