STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
std::tr1::regex_replaceで文字列を置換して 置換した箇所を取得する方法を教えてください。
次のコードをGCCでコンパイルしようとすると、 aho.cxx:12: error: cannot dynamic_cast ‘this’ (of type ‘const class Base* const’) to type ‘const class Derived* const’ (source type is not polymorphic) と出ます。基底クラス内で、thisをアップキャストすることは不可能でしょうか。 実際にはDerived1やDerived2のような継承クラスがいくつかあり、Baseは抽象クラスです。 Base::Foo()は、どのクラスに継承されたかを調べるメソッドです。 Fooをそれぞれのクラスでオーバーライドするべき、というのは理解した上での質問です。 class Derived; class Base { public: int Foo() const; }; class Derived : public Base { }; int Base::Foo() const { const Derived* const p = dynamic_cast<const Derived* const>(this); if(p){ return 1; } return 0; }
>>8 *source type is not polymorphic*
>>9 ありがとうございます。解決しました。
virtual int Foo() const;
にすれば良いようです。
何かしらの仮想関数をもたないとdynamic_castに必要なv-tableを持てないからエラーを吐く Baseクラスが派生されること前提にしてるならデストラクタをvirtualすればいいと思う というかするべきだと思う
12 :
デフォルトの名無しさん :2010/08/06(金) 10:36:59
ある計算結果Aがあります。 Aを再利用する為に、キー値を使って std::mapに入れて管理したいと思います。 Aがmapにあれば更新され、無ければ追加されます。 Aは複数あるので、そのまま使っていくとmapのサイズが 無尽蔵に大きくなってしまいます。 そこで、mapのサイズに上限を設けて、上限を超えたら 古いAから削除する実装にしたいと思います。 std::map< key, item > map; std:dequeue< map::iterator > queue; こういう実装を考えたのですが、Aが追加ではなく更新された場合、 queueの中ほどに入っているiteratorを削除して、おけつにpushしなければならず 効率が悪く感じました。もっと良い実装案はないでしょうか?
queueじゃなくlistを使って 使った要素を毎回先頭につなぎなおす
>>12 std::list< item > map;
std::map< key, list::iterator > map;
これでいいんじゃね?
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
foo::bar foo:bar の違いってなんでしたでしょうか
foo:bar bit field だっけ あんまり使わんな
18 :
デフォルトの名無しさん :2010/08/07(土) 15:16:11
goto foo;
19 :
デフォルトの名無しさん :2010/08/07(土) 16:54:46
てすと
>>7 無理なんじゃないでしょうか。
regex_searchでなんとかするしかなさそう。
mallocの戻り値はvoid *ですが、これをキャストするには 括弧よりもstatic_castの方がいいよね?
なんでmalloc使うの?
3次元ベクトルの計算したいだけの場合って std:vectorをわざわざつかわないで単純に配列そのまま使うのがいいの?
>>23 お好きにどうぞ。
固定長の配列にstd::vectorを使うのは余計なコストが掛かりますが、
可変長になったときにも融通が利きます。
が、ベクタ演算とstd::vectorを混乱したまま理解していないかちょっと心配。
25 :
21 :2010/08/10(火) 19:46:27
>>22 C言語の関数を使っているから
他のスレでそう進められたから
今のCPUはリターンスタックを何レベルか内部に内蔵してるし投機実行するから CALL/RETでのコストなんてわずかなもんだしパイプラインも途切れないよ x86が条件付きCALL命令を持ってないのは今から考えるととても幸いしている
>>26 なんでCISCの話してんの?
あんたは化石か?
std:vectorだと要素の3番目にアクセスするのに1番目2番目3番目とnextポインターたどることになるんじゃないの? 配列ならそんなことない
馬鹿なの?死ぬの?
節子、それ std::list や。
std:deque は便利
>>29 std::vectorは[]演算子で直接3番目にアクセスできるし、イテレーターでも+=で3番目に直接飛べるし
STLのぺぇじ がなくなってる
てst
>>29 std::listじゃあるまいし、std::vectorはランダムアクセス可能。
実装にもよるが、大概 operator[]なら配列と変わらんぞ
37 :
36 :2010/08/11(水) 16:06:18
38 :
36 :2010/08/11(水) 16:07:27
36は一人で混乱しています 29あてでよかった…
俺の胸でも見て落ち着け
>>40 のリンクを開いて
「AT&TのBjarne StroustrupがC++をこの世に送り出しました。」
この世を去ったかと思った。
禿ぱねぇな
空のクラスのsizeofの結果が1になるんですが なんで1byteなんですか?
>>43 §9.3
3 Complete objects and member subobjects of class type shall have nonzero size.
つまりクラスのサイズは最低1なければならない。これは別クラスかどうかアドレスで区別
出来るように設けられた規則である。当然空のクラスもサイズは最低1になる。
ネームスペースをつけずに作ってあとで後悔することってありますか? あとからまとめてつけれませんか?
なんのための名前空間だよwww
ネームスペースを付けないことの方が有り得ない
社内限定のプロジェクトやライブラリでは後悔することないねぇ。 10年前はきちんとやってたけど5年くらい前から馬鹿らしくなって手を抜いてる。 社内でネームスペース付けてる奴自体少数派だし、困ったという話は聞かない。 しかし外販用やフリーで配布するライブラリなら最初から付けておかないと後悔すると思う。 boostがネームスペース使ってなかったら死ぬと思う。 それよりマイクロソフトのwindows.hにあるマクロ類が、 ネームスペースで解決不能なので困る。
>>43 C++ Glossary
ttp://www.kmonos.net/alang/cpp/glossary.html > EBO (Empty Base Optimization)
> 空の基底クラスの最適化。
> メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
> しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、
> sizeof( EmptyClass ) は 0 にはなりません。 EmptyClass arr[100];
> assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい単独で使う時にはこの無駄は仕方のないところですが、
> 例えばこの空クラスから他のクラスを派生するときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の分だけを確保する、
> という最適化が可能です。 C++の規格で許されているこの最適化のことを、Empty Base Optimization と呼びます。
>>45 > ネームスペースをつけずに作ってあとで後悔することってありますか?
グローバルじゃなければ最低限のマナーを守っていると
考えていいと思う。
グローバル名前空間に放り投げるのは思いやりがないよ。
> あとからまとめてつけれませんか?
なにを無茶おっしゃいますか
コンパイラは Visual C++ 2008 を使用 以下のコードを実行させると。。。 enum index { first, second, third, end_of_index }; index & operator +=( index & dst, const index & src ) { reinterpret_cast< int & >( dst ) += src; assert( ( first <= dst ) && ( dst < end_of_index ) ); return ( dst ); } index operator +( const index & left, const index & right ) { return ( index( left ) += right ); } int main( int argc, char * argv[] ) { index a, b = first, c = second; a = b + c; } b の中身も変わってしまうのは何故なんだぜ?
>>51 index operator +( const index & left, const index & right ) {
index t = left;
return (t += right );
}
でいいんじゃない?
>>51 コンパイルエラーのコードだからじゃね?
g++とComeau C/C++では普通に通らなかったよ?
"ComeauTest.c"
error: no operator "+=" matches these operands
operand types are: index += const index
return ( index( left ) += right );
^
1 error detected in the compilation of "ComeauTest.c".
In strict mode, with -tused, Compile failed
Hit the Back Button to review your code and compile options.
Compiled with C++0x extensions enabled.
>>52 いや、こうならないように回避する方法はいくらでもあるけど
このコードでこういう結果になる理由が知りたいんだよね
>>53 Visual C++ 2008 では error も worning も一切出ずにビルドできるんだよね
っていうかこのコードってどっか間違ってる?
55 :
53 :2010/08/14(土) 22:28:59
>>54 俺がはったエラーメッセージを読まねぇのか読めねぇのかしらんが
ちょいと自分で考えておくんなさいまし。
g++でもComeau C/C++でも通らないんだからそのコードは誤り。
とくにstrictのComeau C/C++で通らないって事は
ほぼ間違いなく、誤りがあるってこと。
そして誤りがあるコードは未定義の動作。
56 :
51 :2010/08/14(土) 22:45:56
名前欄にレス番入れるの忘れてました^^ index( left ) のところで index の一時変数が作られて operator += に渡されて っていう動作を期待してたんだけど、正規の C++ の仕様ではないのかな? Visual C++ 2008 のデバックモードでステップで追っていくと 期待したような動作をしてるんだけど b の値が変わるんで何故なのかなと思ったもんでね
index型にキャストされてconstが取れるから変わっちゃうんじゃね?
58 :
51 :2010/08/14(土) 22:58:10
キャストになっちゃうわけかな? index( left ) ではクラスのように一時的なインスタンスは作られないってことかね
>>54 回避する方法が思いつくなら原因もわかるだろ。
みれば一発じゃん。
演算子が += である必要はあるのか?
必要性じゃなくて動作を聞いてるんだろが
62 :
51 :2010/08/14(土) 23:06:14
まぁしかしこのコードが通ってしまう Visual C++ 2008 の方に問題があるよね? 特にこのコードが必要なわけじゃなくてどこまで変則的なコードが通るものか今いろいろ試しててね その中で見つけたヤツなのよ
C++型のキャストでなく C型のキャストの存在する悪がここに見参。
>>52 が答えを示していた件について
・・・何だっけ?
コンパイラはそう言う最適化をして良いだとかなんだとかあったよな。
66 :
65 :2010/08/14(土) 23:11:08
>>64 いや一応質問すれで、質問の本題が
動作の理由の話をしているわけだから、
>>60 の答えはおかしいだろ、国語の授業としても。
>>45 ところでこいつマルチポストだった。
せっかく応えた俺の誠意を踏みにじりやがって。
なんか言えよお前。
68 :
51 :2010/08/14(土) 23:24:27
>>63 ああそうか
C型のキャストが適用されてるわけか
それで const 属性が外れてしまうと。。。
やっぱり enum じゃクラスのように一時インスタンスは作られないんだね
>>61 >>66 質問の意味を汲み取っていただいてありがとうございます
>>45 ,,.----、
i | | | _____
/ | | | / ヽ
/ / | | | ^o^ | <ネームスペースをつけずに作ってあとで後悔することってありますか?
/ / 人ヽ、 !ー!\_/ヽ、
/ /ノ,,,,,,ヽ、ヾ .|ヾ ゞ / !ヽ`ヽ- 、
/ //、 `,ヽ .| ヾ /ヾ ヾ `ー-- 、
/ // ` '´ ,ヽ||´~~ヽ ヽ、, '"´``.、 .ヽ
| ((ー‐ ● ---.||" ,, i i;;;;" ゛;;;;i |
| ヾ、 ,. ´, 、 || ,/ |ll!!!^!!!lllノ .ノ
ヾ i lヾ i ヾ ,/ |"" ,, 'ヽ ,,, / |
| l l;;;;;`;,,,, ゞ-‐´/ ,,| ゞ`ヾ ヾ |
/ ̄\
| | <お前は マルチポスト です
\_/
_| |_
ttp://hibari.2ch.net/test/read.cgi/tech/1280950209/66 ttp://hibari.2ch.net/test/read.cgi/tech/1280914463/45 せっかく応えた俺の誠意を踏みにじりやがって。
なんか言えよお前。
71 :
デフォルトの名無しさん :2010/08/15(日) 00:03:21
藁
72 :
51 :2010/08/15(日) 00:41:01
ごめんなさい 最初に↓のコードを書き込んでから質問すればよかったですね
73 :
51 :2010/08/15(日) 00:41:42
class index { public: enum hoge { first, second, third, end_of_index }; index() {} index( hoge src ) : num( src ) { assert( ( first <= num ) && ( num < end_of_index ) ); } index & operator +=( const index & src ) { num += src.num; assert( ( first, <= num ) && ( num < end_of_index ) ); return ( * this ); } private: int num; }; index operator +( const index & left, const index & right ) { return ( index( left ) += right ); } int main( int argc, char * argv[] ) { index a, b = index::first, c = index::second; a = b + c; }
74 :
51 :2010/08/15(日) 00:42:29
↑のクラス定義のコードなら意図した通りの動作をするのに 何故 enum の演算子のオーバーライドの時はそうならないのか疑問だったもので ユーザー定義型の enum ならクラスのように一時インスタンスが作られるのだろうと 思い込んでました^^
enumとclassは全然違うから もっと勉強した方がいいよ
>>51 のコードが不正なのは一時変数をint&で拘束できないからだろ
何で誰も気づかないんだよ。
>>76 おお、それはかの有名なVC独自仕様ってやつじゃないですか。
一時変数が作られるからb自体は変更されないよな? っていう話なんだからそこは別にいいんじゃないの
一時的にメンバ変数を増やしたい場合ってどうするのがよいだろうか クラスstaticなmapにthisポインタとデータをマッピングして代用してるんだけどあんましスマートじゃない気がする
ポインタでデータ持てば?
namespaceがすごく長い場合それを置き換えるにはどうしたらいいですか? ただしusingは使わないものとします。 namespace ThisIsALongNamespaceName { // うんたんうんたん }
#define ThisIsALongNamespaceName UNKO
namespace Test = ThisIsALongNamespaceName;
privateメンバ関数が増殖してきてうざいからヘッダから分離したいんだけどなんかいい方法はないだろうか?
設計を見直す
87 :
デフォルトの名無しさん :2010/08/17(火) 18:46:04
うざいという直感でなく やろうとしていることとクラス化している範囲が 無理なく対応しているかを見るべき これでいいんだ! という場合もある
よかった探しをしよう
参照渡しと値渡しってどっちを優先したような設計がいいの?
>>89 const参照渡しと値渡しは速いほうにすれば問題ない。
>>89 ユーザ定義型はconst参照渡し、組み込み型は値渡し
c++の foo.bar(x) を extern "C" するときの名前のつけかたの慣習みたいなものはないのでしょうか? extern "C" foo_bar(x) とかでしょうか
extern "C" foobar(x)
95 :
デフォルトの名無しさん :2010/08/18(水) 20:59:53
>>92 仮に「慣習」があってもその処理系限り
あきらめろ
てか、メンバ関数をextern "C"ってできるのか。
extern "C"ってCの関数をC++で使うときに使うものじゃなかったっけ?
名前マングリングをCと同じ方法でやるという意味
herbert schildt の本の後、accdlerated c++ で勉強中の身です。
http://codepad.org/8gr5sRPs の
struct Data d;
push_back(d)
では、Data のコピーコンストラクターが呼ばれていると考えていいのでしょうか?
これをキャッチしたいのですが、どう書けばいいのでしょうか?
>>99 POD型だから本当に呼ばれてるかって言われると微妙なんだけど
一応呼ばれてると言えなくもない
検出するにはコピーコンストラクタを書けばいいだろう
キャッチしたいってのはコピーコンストラクタが呼ばれてるのを確認したいってことだよな?
いや微妙も何も無いんだから呼ばれてなんていないよな push_back()での追加はオブジェクトのコピーがされるって言いたかっただけで
POD型のコピーコンストラクタはコンパイラ自動生成の メモリコピーになるんだから、それが呼ばれているよ
goto って関数をまたでジャンプできないのでしょうか
無理 もしできたとしたら地獄だろうな
105 :
デフォルトの名無しさん :2010/08/19(木) 18:08:54
> もしできたとしたら地獄だろうな と、ひたすら逃げ回っていたのが構造化プログラミング ちゃんと秩序を作れば悪くはないというのがアクセス制御や例外処理 もっとも goto という綴りは使っていないが
goto hell setjmpとlongjmpでだとできるらしいけど
107 :
99 :2010/08/19(木) 18:16:19
>>100 ,
>>101 ,
>>102 つまり、push_back() では新しくオブジェクトが生成されて、コピーが行われいる、ということですね。
それがわかれば、納得です。c 上がりの身としてはちょっと抵抗がありますが。
コメントありがとうございました。
108 :
air :2010/08/19(木) 18:16:43
csvを出力する際は、やはりifstreamやofstreamを使うのが無難ですよね?
>>107 Cでも構造体を引数で渡すと同じようにコピーされるじゃん。
構造体じゃなくてもコピーだわな。値渡し=コピー。
111 :
99 :2010/08/19(木) 20:34:44
せめてPOD型でぐぐれよ
コンパイラが勝手にコピーコンストラクタ作ってるだけだろ
何が駄目なの
>>111 listがPODじゃ無いから違うだろう
>>109 push_backの定義は
void push_back( const T& val );
だから引数に関しては参照渡しになっている。
コピーコンストラクタが実行されるのはコンテナに入れるとき。
>>113 そんなものです。(コピー)コンストラクタについて理解した方が良い。
なんか
>>99 は
Accelerated C++に進む前に、基本をちゃんとやっとけってレベルだったんだな
>>119 たぶん素材(ソースとかコンパイル方法とかの情報)全部出してもお前には無理っぽいから
面倒なので無視することにした
もう一度同じ質問繰り返すつもりなら 頼むから別人に成り済ましてくれ
面倒なので無視することにした(キリッ
自己解決しました。
自家発電しました。
てstしました
I do a test!
I wanna do.
But I can't do.
Because...
133 :
デフォルトの名無しさん :2010/08/22(日) 19:52:55
I'm a virgin!
She went to a bargain.
I'm a pick at you.
C++の入門勉強を終えたんですが C++の公開されてるライブラリって少なくないですかね? Windows開発でも屍のMFC/ATLぐらいしかなくメインはWinAPIか魔術DirectXですし MacはObjectiveCですし UNIX/LinuxはCメインですし パット思い浮かぶのはQtぐらいしかないんですが C++のライブラリってあんまりないもんなんですか? 業務とかで自分たちでCの関数をラッパーして作るのが主流?
boostでもしゃぶってろ
138 :
デフォルトの名無しさん :2010/08/22(日) 21:09:36
Boostは汎用的すぐるだろ そうじゃなくてもっと専門に特価したネットワークライブラリ(上級層 HTTP/SMTP)とか画像処理とか サウンド処理とかあってもいいんじゃないかと。
139 :
デフォルトの名無しさん :2010/08/22(日) 21:10:16
>>136 すげえな、もうC++の勉強おわったんかよw
ならもうくんなよなwww
140 :
デフォルトの名無しさん :2010/08/22(日) 21:14:12
>>136 それだけ知っててなぜ無駄口をたたいているヒマがある?
どれでもいいからがっぷり四つに組んでみろ
歩兵用の兵器って認識ねえならやめとけ
141 :
デフォルトの名無しさん :2010/08/22(日) 21:23:36
____ / \ /\ C++は歩兵用の兵器キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ | |r┬-| | \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwwww | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / バ | | l||l 从人 l||l l||l 从人 l||l バ ン ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
ここれははずかしい!
別にどこもおかしくねーぞ?
C++は原爆
C++ の大きな利点って膨大な C のライブラリを使える事だと思う。 いつも使うならラッパー書いても良いけど別に書く必要も無い。 「C++で公開されてるライブラリって少ない」ってC++使う大きな理由に気づいてないような この前 Magick++使ったけど,これは C++専用 API もあるね(いろいろな言語 のAPIあるけど) C++ネイティブのAPIが少ないと感じるとしたらそこまで需要が無い場合が多い からじゃないかな fftw3 とかC++で使ったけど普通に使えて特にラッパー書こうという気もおきなかった
>>146 fftwはplanを作る段階で全てを決定しておく必要があるから余り問題にはならないね。
私はラッパこそ作らないけど、fftwを使うクラスを作ってデストラクタでplanの破棄をするように気をつけてるよ。
GUI系のようにプロパティが沢山あって途中で(変えられる|変えたい)場合はラッパ作っておくと楽だけど。
148 :
air :2010/08/23(月) 14:08:44
CSVファイルを出力するという課題が出ました。 そこで疑問が出たのですが解決していただきたいです。 ・出力先はどこになるのか? ・今回用いるCSVファイルは容量が大きく開くことができません。 出力することにより開けるようになるのでしょうか?
課題をそのまま貼るしかない。
宿題スレにな
152 :
デフォルトの名無しさん :2010/08/23(月) 14:32:52
>>148 ・出力したい場所は自分できめる。
・出力したら何MBになったのか書く。
継承クラスで virtualでない(オーバーライドできない)関数を 同じ名前で定義するコトって、何か名前がありますか? 単純にクラスの型によってオーバーロードっぽい動作をするだけですが… class CBase { virtual void func1(){} void func2(){} }; class CSub { void func1(){} // ←オーバーライド void func2(){} // ←? };
154 :
153 :2010/08/24(火) 05:24:47
コード間違えました class CBase { virtual void func1(){} void func2(){} }; class CSub : public CBase { void func1(){} // ←オーバーライド void func2(){} // ←? };
hide
>>153 virtualじゃなくてもオーバーライドは出来る
オーバーライドではなくハイディングまたは上書き
上書きってoverrideの和訳だと思ってた
上書きは over write だ
virtual でなくてもオーバーライドでしょ
ISO C++でのoverrideはJISでは上書きと訳されてるな。 ちなみにhideは隠ぺい。
163 :
デフォルトの名無しさん :2010/08/24(火) 10:46:08
まあ翻訳なんて 英語→日本語→英語 で完全に元の文になる訳じゃなし
>>156 > virtualじゃなくてもオーバーライドは出来る
俺もそうだと思っていたが、規格の上ではそうじゃないらしい。
virtual じゃないものをオーバーライドすると文字通り上書きだがポリモーフィズムが機能しない virtual なものをオーバーライドするとポリモーフィズム動作してくれる ってことで内科医
俺も virtual でなくても override と呼ぶ(ただ,すべきではないだけ)と思ってた けど調べたら違うみたいね Meyers は redefine と書いてるし「再定義」位が良いのかな
オーバーロードのことだと思ってた
初学者としてはオーバーライドとオーバーロードの意味がものすごい勢いでごっちゃになる
>>165 いや、そもそも
> virtual じゃないものをオーバーライドする
ということができない。
polymorphism以外の点ではまるでそっくりな記法と結果を期待できるが、
規格の上ではそれをoverrideと呼ばないってこと。
俺は以前はpolymorphismが機能しないoverrideと
機能するoverrideがあるのかと思っていたが、
そうじゃなかった、overrideという用語の定義自体に
すでにvirtualな物にたいして使いpolymorphismが機能することが
前提になっていた。
とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
仮想関数にしないとオーバーライドできないなんて超常識だろ ココはど素人の集まりかよ
>>170 > とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
機能というか、用語の定義を、でしょ。
隠蔽とごっちゃになっている人が多いんだろう。
確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
>>172 いや機能を理解してればごっちゃにならないから
振る舞いが一緒とか寝言は寝ていえってレベル
俺は他人よりも理解しているの法則発動
お前らど素人だろどうせ
結局答えは?隠蔽でいいの?
struct A { int a; }; void Print( A& a ){ printf( "%d\n", a.a ); } A a; Print( a ); Print( A() ); ってやると結果が 2008736204 0 になるんですけどなんで違うんですか。
>>178 初期化してないからゴミがはいってるんじゃね。
>>153 すでに
>>155 ,
>>162 で答えられてるけど 隠ぺい(hide)
JIS X3014 23ページより...
3.3.7 名前は,入れ子になった宣言領域 又は 派生クラスの中で,それと同じ名前を明示的に宣言する
と 隠ぺい(hide) することができる (10.2 参照)。
オーバーライドでも隠蔽されるけどな
またVC++か
184 :
172 :2010/08/24(火) 22:55:45
>>173 具体的に俺のレスで誤っている所を一つでも指摘してみろ。
できないだろどうせ。
だって誤りはないんだもの。
185 :
153 :2010/08/24(火) 23:35:10
>>155 ,162
ありがとうございました!
なんて言ったらいいのかわからずもやもやしていたので、すっきりしました!!
>>180 定義されているところまでありがとうございます!!
>>155-177 思ってもみない方向に議論が…ι
>>178 上は未初期化で↓はデフォコン初期化なんじゃね
下でも何もしないコンストラクタ書くと同じ結果になった
A a(); Print( a ); Print( A() );
>>184 >隠蔽とごっちゃになっている人が多いんだろう。
>確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
スマソ、隠蔽とオーバーライドを比べてるのかと早とちりした。
>>188 隠蔽とオーバーライドを比べてるとしか読めないんだけど、
ほんとは何と何の「振る舞いが同じ」って言ってんの?
次はきっとPODと非PODの混同にぶち当たるんだな
分からない私にだれか分かりやすく教えてください。 というか実際 分かってないで使っているのが 案外私以外にもいるって知ってちょっと安心。
「仮想関数でないとオーバーライドはできない」 このことを理解できてない奴が多いだけ
>>191 まとめるとこうですの
class A
{
public:
virtual ~A();
virtual void override();
void overload();
};
class B :public A
{
public:
virtual void override(); //virtualはなくても同じ
void overload();
};
void hoge()
{
B b;
A& a=b;
a.override(); //B::override()が呼ばれる
a.overload(); //A::overload()がよばれる
b.override(); //B::override()が呼ばれる
b.overload(); //B::overload()が呼ばれる
}
オーバーロードと隠蔽がごっちゃになってる人は多そう
195 :
191 :2010/08/25(水) 14:13:55
>>193 ありがとうございます。
> void overload();
は、オーバーロードと呼ぶのですか?
それとも隠蔽と呼ぶのですか??
オーバーロードとは
class X
{
public:
void overload(int);
void overload(char);
void overload(const X&);
> };
こういう物だと思っておりましたが。
いまだにオーバーロードとライドが、どっちがどっちだったかゴッチャになる。
197 :
193 :2010/08/25(水) 14:20:15
これはひどい
>>193 何を訳のわからんことを書いてるんだ
お前が他人に教えるなんて100年早いわ
↓オーバーロードとオーバーライドと迷い猫オーバーランとオーバードライブの違いを説明してくれ
>>184 お前も黙れ、
>>172 は間違っている
関数テーブルが変わってくるので、当然振る舞いも変わる
つかこの辺のことをわかってないくせいに、よくも他人のことをああだだこうだ言えるよな
知らなかったしても、少しは調べてから発言しろよ
>>192 > 「仮想関数でないとオーバーライドはできない」
これは本当?
規格にはそんなこと書いてないと思うんだけど。どこに書いてあるの?
「仮想関数を使うとオーバーライドできる」というようなことは書いてあるけど。
見落としてるのかな。
まあ、「オーバーライド」という言葉は仮想関数に関するときしか使わないというのには同意するけど。
>>195 >> void overload();
>は、オーバーロードと呼ぶのですか?
>それとも隠蔽と呼ぶのですか??
別にその関数宣言自体を「隠ぺい」(名詞)と呼ぶ訳じゃないでしょ。
「関数B::overloadは関数A::overloadを隠ぺいする」と表現する。
「関数B::overloadは関数A::overloadの隠ぺいである」とは普通言わないんじゃない?
なんか一連の議論を見てると言葉の使い方が気持ち悪くて仕方ないんだよね。
>>196 オーバーロード→王→覆う→世界を覆う共通認識→共通→共通の名前
オーバーライド→井戸→土地に付属→代々継承される→継承
>>202 >これは本当?
オーバーライドは仮想関数テーブルにある関数へのポインタを書き換えるということだよ。
上書きするからオーバーライド。
仮想関数でなければテーブル自体が存在しないんだよ。
存在しない物をのをどうやってオーバーライドするというんだ。
お前は何をオーバーライドするつもりなんだ。
別の場所に新たに作成されるのがオーバーライドのはずがない。
>同意するけど。
お前の同意などいらん。あほか。
205 :
デフォルトの名無しさん :2010/08/25(水) 15:48:12
オーバーハイドですね!
>>202 あと隠蔽の意味全然わかってないな。
隠蔽というのは別々に存在している状態で、手前の奴が後ろの物を隠した状態のことだよ。
手前にあるから後ろが見えないだけ。だから工夫すればアクセスも可能。
対して上書きは元の物が上書きされて消失した状態。
オーバーライドしても同じ工夫でアクセスできるんじゃね? どんな工夫か知らないけど
>>207 ヘー君が使ってるメモリは上書きしても前のデータが読めるんだ。
そりゃ凄いな。
で、どんな工夫でアクセスすんの?
210 :
202 :2010/08/25(水) 16:20:37
>>204 いや、だからあなたの言うオーバーライドという言葉の定義はどこで仕入れた知識なのかを聞いているんだけど。
規格上は残念ながらあなたの言うようには定義されていないんだよ。
「オーバーライド」という単独の言葉がどこまでの範囲を指すかは、かなり曖昧に見える。
たとえばコンパイラ内のシンボルテーブルの上書き、
という意味で使ってはいけない理由を示してもらえないと、
>>192 は
嘘だったことになるんだけど。
仮想関数の仕組みは百も承知。
>>192 >「仮想関数でないとオーバーライドはできない」
これは「仮想関数でないと(仮想関数テーブル内のポインタを)オーバーライドできない」の省略だったってこと?
>>206 隠ぺいって規格の3.3.7に書かれている名前の隠ぺいのことだよね?
なんで分かってないと思うのか分からん。
>>210 >たとえばコンパイラ内のシンボルテーブルの上書き、
>という意味で使ってはいけない理由を示してもらえないと、
おいおい「シンボルテーブルの上書き」ってw
サブクラスに同名関数があるとこういうことが起こると思ってるの?
もちろんこんなことは起こらないよね。
要するに上書きされる物が無いのにオーバーライドとは言わないだろ。
逆に聞きたいが、お前は何が上書きされると思ってるんだ。
>>209 仮想関数だったものは上書きされてるからアクセスできない。
仮想関数でなければ、例えばキャストすればアクセスできる。
>>212 例えばa.A::override();とかは駄目なの?
214 :
202 :2010/08/25(水) 17:00:07
>>211 やれやれ、本当に何を聞かれているのか分かっていないんだな。
まあいいや。
×「仮想関数でないとオーバーライドはできない」
○「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」
ということで。
>>210 C++ 英語版 wiki に overrided が使用されている。
もちろん Virtual member functions とセット。
引用元が
Stroustrup, Bjarne (2000). The C++ Programming Language
となっている。この人は C++ の開発者。
この本が C++ の発信源なんだよ。
現状の世の中のC++の情報もこれに反することは書いてないはずだけどね。
けど、こういう厳密な定義を持ち出さずとも、
上書きされる物がないのに、上書きというのはおかしいだろう。
仮想関数の基本動作が理解できていればわかるはずだけどね。
216 :
デフォルトの名無しさん :2010/08/25(水) 17:06:00
スコープが違うのにオーバーロードって?
>>214 違う。
◎「仮想関数でないとオーバーライドはできない」
仮想関数でないと関数テーブルが作成されないので、オーバーライドを実現するすべがない
?「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」
日本語になってない。仮想関数はオーバーライドされる方でしょ。
202さんは何が上書き(オーバーライド)されると考えているのでしょうか? それとも上書きされるものがなくても、オーバーライドと言っても構わないという考え?いうはおかしくないという考えなんでしょうか?
>>217 いいから、規格書の10.3を読めよ。
仮想関数が仮想関数を上書きするんだよ。
だいたいオーバーライドってのはオブジェクト指向プログラミングの
メソッドオーバーライディングのことを指しているんであって、
仮想関数テーブルの上書きはまた別な話だろう。
>>219 お前こそ読み直せよ!!!
仮想関数は上書きされる方と書いてあるぞ。お前の読解力は問題ありすぎだわ。
お前は、
>簡便性のため、すべての仮想関数は、自分自身を上書きするものとする。
という一文の意味を取り違えて解釈してるだけじゃんwwwwwwwwwwwww
「簡便性のため」や「自分自身」という意味を考えろよ。
仮想関数をオーバーライドするときに、オーバーライドする方は仮想関数である必要ないだろ。
一体どのレベルから理解できてないんだ????
>>219 >メソッドオーバーライディングのことを指しているんであって、
>仮想関数テーブルの上書きはまた別な話だろう。
C++ではメソッドオーバーライディングを実現する唯一の方法が
仮想関数テーブルの上書きでしょう。お前が別の話だと妄想してるだけ。
>>220 いや、よく読んでよ。
> Derived::vfは,(virtualと宣言されていなくても)仮想となり, Base::vfを上書きする。
とかかれてるでしょ?
上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。
ところで何で終始そんなにカッカしてるの?
>>221 「別の話」と書いたのは不適切だったかもね。
「単に実装の詳細の話」とすべきだったかな。
> C++ではメソッドオーバーライディングを実現する唯一の方法が > 仮想関数テーブルの上書きでしょう。 なんて言っちゃうところも無知をさらけ出しているよね。
>>222 >上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。
違う。対象が仮想関数だから、仮想関数となる(変化する)ということ。
上書きする方は仮想関数である必要はない。
これはvtableに格納されるんだから、動作的にはこれでいい。
何れにしても、オーバーロードする方は仮想関数である必要はない。
>>224 そう思うのは、お前がオーバーライドを
オーバーロードや隠蔽と混同している証拠だね。
隠蔽なら他の方法があるけど、オーバーライドは vtable を使った方法しかない。
>>225 >何れにしても、オーバーロードする方は仮想関数である必要はない。
何れにしても、オーバーライドする方は仮想関数である必要はない。
の間違いだわ。
とりあえず名前がオーバーライド(ロードか?)されまくってるからユニークなものにしてよ
>>226 実装と規格の話題がごっちゃになってるよ
そろそろ整理した方がいいんじゃね
>>229 俺は実装、規格に共通したことしか言ってない。
「仮想関数でないとオーバーライドはできない」
C++ の実装、規格ともにそう。
C++の開発者がそう規定しており、自身の本にもそう書いてある。
世の中のC++書籍やまともなサイトでもそう記述されている。
202の馬鹿が彼方此方かき集めて支離滅裂なことを言ってるだけ。
>>230 規格ってvtableについても書いてあるの?
232 :
デフォルトの名無しさん :2010/08/25(水) 18:46:00
オーバーライドできるのが仮想関数で 仮想関数でないとオーバーライドできない これ循環証明だろ
>>232 証明?
定義だよ。C++ の開発者がそう定義して、
C++の普及に伴い世の中浸透して、規格化もされているし、当然実装もそうなっている。
世の中の書籍にもそう書いてあるし、ネットで調べてももちろん同じ結果。
本当に 「仮想関数でないとオーバーライドはできない」 を否定したいのなら、
反例を一つ上げるだけの話だよ。それすらできないんだから。
要するに初心者がオーバーロードや隠蔽とごっちゃにしてるだけの話なんだよ。
234 :
デフォルトの名無しさん :2010/08/25(水) 19:17:17
>>233 > 定義だよ
ああ、そりゃ悪かった
C++ の開発者ってパゲのことか?
言い出しっぺではあるが今そのタイトルで呼ぶと色んな人に失礼だと思うよ
規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね
仮想関数に近いことは他の手段でもできるんだが
おたくさんが規格と用語にこだわるようなので今は言わないでおく
>>234 規格だけの話はしていない。
>規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね
規格だけでなく、実装、書籍、ネット全てがそういう認識と言うこと。
そももC++の規格なんて、C++が実装されて、世の中に普及して、書籍も沢山でたその後だよ。
規格なんかよりずーっと前からオーバーライドはプログラマーの共通認識なわけ。
規格書読んでC++の習得する奴なんかいないだろう。初心者なんだから規格を気にする前に、
書籍とかネットでの共通認識を素直に取りこめばいいんだよ。固定観念持ちすぎなんだよ。
>仮想関数に近いことは他の手段でもできるんだが
>おたくさんが規格と用語にこだわるようなので今は言わないでおく
こういう捻くれた解釈はやめなさい。違うものは違うんだよ。隠蔽は隠蔽でしかない。
自分の感覚を世の中に合わせる努力も必要だよ。
>>233 「オーバーライドならば仮想関数である」
を
「仮想関数でないならばオーバーライドではない」
と言い換えてるだけなんだぜ
知るかそんなやつ
魔道書の人、ここみてんのか。
俺が確認したかぎり、こことC++0xスレとBoostスレを見ていると思われる。 今C++0xの本を執筆しようとしてなんとかと言ってたようだが詳細はしらね
最新のドラフト N3092 の 10.3 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, parameter-type-list (8.3.5),
> cv-qualification, and refqualifier (or absence of same) as Base::vf is
> declared, then Derived::vf is also virtual (whether or not it is so
> declared) and it /overrides/ Base::vf.
上記 /overrides/ は、これが用語の定義であることを示す斜体表記になって
いる。( 1.3 p2 )
日本語によるまとめ。
http://cpplover.blogspot.com/2010/08/overloadoverridehiding.html 上記により、「仮想関数でないとオーバーライドはできない」は本当。
ただしこれが本当であることを示すのに vtable 云々(実装の詳細の話)を
持ち出す必要もないし(ここまでの残念な流れを見れば明らかなように)不適切。
みんな何と戦っているんだ
自分とのたたかいだよ(キリッ
>>237 >Derived classの非virtualなメンバー関数に対し、同名のBase classの非virtualなメンバー関数がある場合、
>それは単に、名前を隠しているだけである。
これDerived classは非virtualかどうかって関係無いよね?
245 :
デフォルトの名無しさん :2010/08/26(木) 10:29:51
C++でソケット通信を行いたいのですが、いい日本語のリファレンスをご存じないですか?
入れるデータの数の上限が無いハッシュテーブルってどうやって作るんですか?
>>247 データ数に上限のない普通のテーブルなら作れるのか?
話はそれからだ
テーブルという名前のデータ構造は存在しませんが何か?
>>249 普通のテーブルというのはハッシュ化してないテーブルという意味だよ。
日本語にすると表とか配列のこと。
可変長の配列を作る方法がわからないのか、
それともハッシュ化するところで躓いてるのかがわからんのだよ。
可変長の配列を作る方法が分かったとしても サイズが変わるとハッシュ関数も変わっちゃうから 出来ないのは当たり前じゃないですか。
>>251 縦方向の話じゃなくて、横。。。って言っても伝わらないか。
ハッシュ関数が同じ値を返してくる場合があるよね、
それをどう処理するのがハッシュテーブルを作る上で大変なところ。
ハッシュ値が重複したものに対しての受け皿は可変になるよね。
扱えるデーター数が無制限ということなんだから、この部分も無制限にする必要があるでしょ。
それとも、ハッシュ値が重複しても知らないよって話?上書きでOK?
それなら固定長の配列用意して、適当な index を返すハッシュ関数作ればいいだけ。
ハッシュ関数の作り方がわからないってことか?
そんな回りくどい書き方しないで外部ハッシュ法を使うの 一言ですむことじゃないですか。 なぜそうしないんですか? ちなみに他のスレで解決したのでもういいです。 有難うございました。
>>253 それは失礼したね。
どのレベルで質問してるのかがこっちには分からなかったのだよ。
とりあえず、解決できてよかったね。
>>253 > ちなみに他のスレで解決したのでもういいです。
なんでそんなマルチポスト野郎が偉そうなんだろうか。
人格の問題でしょ
そういう病気なんでしょ
>>253 > ちなみに他のスレで解決したのでもういいです。
この決めぜりふカッコイイな、ガイキチ。
なんか大変だったみたいすね
>>253 は朝鮮人みたいなやっちゃな
「かつて、本田技研の創業者、本田宗一郎氏が技術支援の為に、台湾と韓国へ
技術支援に行きました。暫くして、台湾から、「日本と同じものが作れるようになりました。
是非見に来てください!」と連絡が入りました。そして暫くして韓国からも連絡が。「日本と
同じものが作れるようになりました。もう来なくてもいいです。」
そして韓国は本田とのライセンス契約を一方的に解消し、エンジンからデザインまで全くの
コピー品を”韓国ブランド”として販売を始めました。
本田宗一郎氏は大変失望してこう話したそうです ”韓国とは絶対に関わるな”」
>>253 とは絶対に関わるな
●宮崎牛精子盗難 ●宮崎牛口蹄疫蔓延 ●宮崎牛全滅 いまココ ●韓国牛輸入
て
UDON
すみません。int型の4〜6桁の整数から 下3桁を抽出するにはどうするのが良いでしょうか? 現状、整数型変数に÷1000した値を入れ、それを1000倍して 差し引いて生成しているのですが、もっとシンプルにできるのでしょうか?
% 剰余演算子
271 :
デフォルトの名無しさん :2010/08/28(土) 20:36:10
シンタックスシュガーて言葉を最近知ってつかいたくてしかたない。
% が
>>266 の構文糖衣になる処理系って有り得るのだろうか。
普通、÷ 1000 した時点で剰余も求まるよな。
なのに乗算と減算を追加する処理系って果たして存在するのかどうか。
くだらない。
auto lambda = [] () {}; void func(/* lambdaを引数にとる関数の書き方を教えてください */);
>>276 template<typename T> で T とか、 std::function<void ()> とか。
struct A { int a; int b; int c; int d; }; こんな感じの構造体をクラスのメンバ変数にした場合、 0で埋めるコスト安い方法ってなんですか。memset以外で。
A a = {0};
>>277 勉強させていただきました。ありがとうございます。
これは便利だなあ。
いまどきメタテンできないとかやばいよね
>>279 これだとどういう理由でメンバが0で埋まるんですか?
287 :
別人 :2010/08/28(土) 23:40:36
デバッグモードでビルドしたから
VS2010のリリースビルドでも0で埋まります。何故ですか。
PODの明示的コンストラクタ呼び出しは0初期化と決まっているから。
290 :
287 :2010/08/29(日) 00:28:49
サンクス!
292 :
デフォルトの名無しさん :2010/08/29(日) 14:33:39
PODが0で初期化されるのってコンパイラ依存じゃなくて、仕様できまったんだっけ?
知りたきゃ自分で調べて勝手に納得してな
>>292 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf 8.5.1 Aggregates の 第7節
7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member
not explicitly initialized shall be value-initialized (8.5).
8.5 Initializers の 第7節
7 To value-initialize an object of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object
is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is
called.
8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class
subobject is zero-initialized;
8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression,
converted to T;
ってことで仕様で決まってます
上のPDFは0xのものだけど引用部分は03規格とだいたい同じです(03最終草案とはちょっと違います)
>>279 質問の元はこっちかw
5.2.3 Explicit type conversion の 第2節
2 The expression T(), where T is a simple-type-specifier or typename-specifier for a non-array complete object
type or the (possibly cv-qualified) void type, creates an rvalue a prvalue of the specified type, which is
value-initialized (8.5; no initialization is done for the void() case).
value-initialized から先は
>>294 のとおり
296 :
デフォルトの名無しさん :2010/08/30(月) 14:14:13
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine ); for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){ cout << *p + "\t"; } cout << endl; これを出力すると a e d q d r r u t になります。 これをタブ区切りでtsvファイルに出力したいのですがどうすればよいでしょうか?
297 :
デフォルトの名無しさん :2010/08/30(月) 14:15:39
298 :
デフォルトの名無しさん :2010/08/30(月) 14:19:32
すみません。 もう1つの方はC言語で、こちらがC++だったので2つの書き込みをしてしまいました。 申し訳ありません。 本当はこちらに質問したかったです。
>>298 いや、boostにも同じ質問しているだろ。
他に移動するときは断り書きをしたうえで、質問のポイントを再検討してから質問するのが道理。
で、あんたは何が判らないんだ? 素直にくだスレにでも行った方が無難なようだが。
300 :
デフォルトの名無しさん :2010/08/30(月) 14:32:14
すみませんでした。 今は標準出力なのですがこれをtsvファイルに出力したいと思っています。 私が分からないのはこの1点です。
>>296 #include <fstream>
:
:
ofstream ofs("data.tsv");
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
ofs << *p + "\t";
}
303 :
デフォルトの名無しさん :2010/08/30(月) 14:41:17
ありがとうございます。今実行しましたが1行しか出力されていません。 どうすれば全行出力されますか? <実行> a e d q d r r u t したいのですが、 a e d しか表示されませんでした。
304 :
デフォルトの名無しさん :2010/08/30(月) 15:29:27
ofs << endl;
305 :
デフォルトの名無しさん :2010/08/30(月) 15:31:51
301を訂正します。 <実行> a e d q d r r u t したいのですが、 最後の1行の r u t しか表示されませんでした。 全行表示するにはどうすれば良いでしょうか?
306 :
デフォルトの名無しさん :2010/08/30(月) 15:41:14
先ほどの段階でofs << endl;は入れていましたが最後の1行しか表示されないです。
>>296 のcoutをofstreamに置き換えて、出力結果が違うってあるの?
それとも最初からバグってる?
308 :
デフォルトの名無しさん :2010/08/30(月) 15:48:07
改行コードが違うんじゃね
309 :
デフォルトの名無しさん :2010/08/30(月) 15:53:44
c++filtの逆をする、つまり、g++名 -> C名をしてくれるプログラムはありますか?
310 :
デフォルトの名無しさん :2010/08/30(月) 16:08:46
初心者なもので309さんがおっしゃっていることが分かりません。 307さんのおっしゃる通りcoutをofstreamに置き換えてしましたが出力結果が違います。
一行ごとにファイルを開いちゃってまずいことになってると予想
>>311 ああ、それかもね。
ループのなかにofstream ofs("data.tsv"); を入れちゃってる。
314 :
309 :2010/08/30(月) 16:37:14
>>310 tsvファイルとは関係のない話です。唐突でした。
f.c: void f(int) {}をg++ -c f.cしたのち、nm f.oすると、
00000000 T _Z1fi
と表示されます。ここで、c++filt _Z1fiすると、
f(int)
と表示されます。
あるかと尋ねたのは、この逆の動作をする、「f(int)を入れると_Z1fiが出てくるプログラム」です。
315 :
デフォルトの名無しさん :2010/08/30(月) 16:49:32
311さんと313さん、ご指摘ありがとうございます。 しかし、ループの中にはいれていません。
318 :
309 :2010/08/30(月) 17:35:58
>>315 何度か他人が指摘しているけど \r はあっても \n が無い
とそういう状況になるはず
そんなにわからないならコードをちゃんと出せって
情報小出しにされても皆わからん
320 :
デフォルトの名無しさん :2010/08/30(月) 18:01:38
319さん申し訳ありません。 これがプログラムです。 void A::ReadFromCsvLine( const std::string& csvLine ) { ofstream ofs("test.tsv"); boost::tokenizer< escaped_list_separator_sjis > tok( csvLine ); for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){ ofs << *p + "\t" ; cout << *p + "\t"; } ofs << endl; cout << endl; ofs.close (); これで実行すると、 標準出力の方は a e d q d r r u t のようになり、tcvファイルの方は r u t となります。 私はtcvファイルの方を標準出力の結果と同じにしたいです。
ファイルを上書きしてるだけじゃないの?
>>320 >308
その"test.tsv"をどっかにアップロードして味噌。
これがプログラムです(キリ
あーなるほど、ReadFromCsvLine()を毎行呼んでいるのか。 だとしたら、最初の行を処理する前に定義して、ReadFromCsvLine()にはofsの参照を渡せばいいや。
追記じゃなくて上書きしてるよなぁwwww
>>325 >323は断片のみの提示に対して不満を訴えているものと思われる。
329 :
デフォルトの名無しさん :2010/08/30(月) 18:15:04
みなさんありがとうございます。 どなたか変更後のプログラムを載せていただけないでしょうか?
マルチすんなぼけ
std::ofstream ofs( "test.tsv", std::ios::out | std::ios::app ); とりあえずこうすればいいんじゃないかな これはこれで後で困りそうだけど
2回動かしたら行が2倍になりました。 ってかw
>>327 ならそう書けばいいのにね
使い方的に全然適当じゃないし
> 私が分からないのはこの1点です。 絶対嘘。 プログラムの基本分かってないだろ。
結局
>>311 ,313だったわけか
forか関数呼出かの違いで
|::::::::::::::::: ____________ :::::::::| 手 |::::::::::::: ,. '":::::::::::::::::::::::::`ヽ. ::::::::| 頭 ど 遅 |::::: /::::::::く:::::::╋::::::::>:::::::::\ :::| で. こ れ |:::: 〈:::::::::;:::--- 、─ァ -- 、:;:::::::::〉 :::| す が で. .|::::: ,〉'" `'´ `ヽ! :| か 悪 す |:::: / / ハ ハ ヽ ヽ 、 ', | ゜ い ね. |:::: i ,' /!__i_, !' ! ,_ハ__ハ ', ! ', ん ゜/:: ノ.! ! /,ィ-ァ!、! レ',ィ-=!、! i ハ 〉 で ´\|:: 〈 ノ Yレヘ''ゞ-' ゞ-''/レ' ン ∠、 す :::: 〈 ハ !ハ." ______ "ハ ハ ! ! か :: ノ、 `ァ'_」>、._`ー' ,,.イ/イ、ノ ヽ. ? / `ァ''´ ', ヽ干´ン::::::::::::`ヽ. `''ー─ ! ヽ/ ,y ヽ、. .,!':::::::::.y::::::::::::', 〉r〈_,.-、7-、 Y十::::.::::::i::::::::::::::〉 : レ^iY⌒ヽ,イ'ヽ-! .|::::::::::::::;ハr、::::Y :: '! ,ィ〈 `y'´`ヽ!::::::::::::/´⌒'/' ::: Y´ヽ、)-'、___ノ、::::::::/ /
, '  ̄ ' ' , , ' 、 ` , / ! \ / / i 、 ' , / / / / ト ヽ ', ,' / / / イi } \ ! , i ,' i i / イ / i | ', ! i .| | |// / //_/ | / | _ ! ! i | | !/-// / / ̄ /, イ /  ̄ i !ト ! | | .i !'// レ__、/イ /!/-_ =-、V i i/ ! i レ' /ィ=ヽ ` レ ' /:て}ヽ 1 ! _ -, -──‐-、 ', i ! イ、|{:し::リ 弋=ソ ヾイ |/ /: : : : : : : : : \. | _|_ |_L / ' ! i ` = '  ̄ / ! / ' ___: : : : : : : : : :ヽ | _|  ̄| _ノ ( ! ! 、 i i/ /:::::::::::::, '' ゙̄ヽ: : : : : '.. レ(__ノ\ | \ ',、 ! __ "/'´ |:::::::::::::::{::::::::::::::}: : : : : :| i!、 、 ト、 / ヽ r‐'了 |:::::::::::::: 、::::::::::ノ: : : : : :| ____ | !ヽ\ !ヽ 、 、_ ノ|::::::| ∨:::::::: '´ ̄: : : : : : : :/ /ヽ, l  ̄|7/ヽ \\! >! ' , ̄ , '_::::\__ \'´ : : : : : : : : : : / /ヽ/ .| ̄ ./| | ノ::::! く _ , !' |::\>N、 l¨'''¬ー- 、 _____, '´ / |___i. ′| ▽ヽ, ィ:::::::::! >< ' /:::::::::/ .二\ , /o /::::::::::::! / || .! /:::::::::/ -‐、∨\ ,..:::{__ == !::::::::::::::!ノ // ヽ /:::::::::::{ ィヽソ|:::::::|
______________________ | | 最近、スレッド荒れてるね… | |_____ ________________ ∨ 三三三三三三三三[BAR KUMAR]三三三三三三三三三三三 _i^i__i^i_ i^i ._i^i_ __, -―- 、___ _i^i_ |*||*| ∩___∩ i^i _i^i_ | | |@ll|(_/,,,, ,,,, ヽ_) |@| |≡||≡|| ノ ヽ ([])|;□;|.(≡)|_| |● ● | |_| . 二二/ ● ● | 二二( (二二二二 彡(_●_ ) ミ二二二 | ( _●_) ミ ) ) i二i__/` ''∪'' / ヽ 彡、 |∪| ノ ,Gノ'フ= ___(___ノ_/i ` ー '" iヽ | / ヽノ ヽ / / | ! | | | l ..──|ヽ ヽ___i二i ヽ./─;==i─Y────────(⌒)─ ____.ヽ\____)ノ └-┘ ┴  ̄ | i ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ (ヽ |_ \ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∧ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ :::::::::::::::::::||\ | / /:::::::::| ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ :::::::::::::::::::||::::| |\___):::::::::::::| 夏休みだからねぇ… :::::::::::::::::::||:::( \:::::::::::::::::::::| せめて宿題終わってからにしてほしいよ… :::::::::::::( )\_):::::::::::::::::::|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
キモ
>>334 質問の仕方も分かってないような気がする
すみません。 char[10] に入れている 0〜99の乱数10個をできるだけ小さなバイト数に纏めてしまいたいのですが、 int型の変数に数字とした4組並べて置く程度しか思いつかず、これじゃ変わらないじゃないか、と。orz 何か良い圧縮〜展開する方法は無いでしょうか・・?
いくらなんでも圧縮対象が小さすぎ
0〜99 に限られてるなら 少なくとも 100/256 で 約 39% までは圧縮可能 とりあえず bit 幅縮めることを検討してみ
駄スレにマジレスありがとう
>>341 おすすめはしないが
7bitで0-99の値を表せるのでビットフィールドを使いつつアライメントと詰めるようにように設定すれば削れるんじゃないかな
これでも冗長性はあるので情報理論的にはまだ削れるらしいんだが
>>345 だと
80bit -> 70bit だからまだかなり無駄があるね
100^10 < (2^8)^8 なので 64bit (8byte) までで表せる
>>347 100^10 = 10^20 > (2^8)^8 = 2^64 = 1.84467441 × 10^19じゃね?
普通に格納したら67ビット必要だろ?
>>348 ありゃ
計算間違えたか
でも理論的には 67bit 未満も可能なんでしょう?
>>349 どのパターンでも格納するという条件ならで67未満は不可能
(いや、符号理論の定義で行けば66.なんとかバイトまで削れるってことになりはするが)
ある0-99の10個の並びというものを突っ込むのであれば圧縮できる場合がある
あたりまえだが
たとえば最短で1バイトに出来るけど最悪で10バイト超えてしまうような圧縮方法でもよくて 平均で10バイト未満に出来る(66ビット以下に出来る)っていうことですね
353 :
341 :2010/08/30(月) 21:04:24
>>342-352 少し難しい話でハッキリと理解できないものがありますが、
7bitずつ並べてしまえば圧縮できるのですね・・ありがとうございました。
354 :
デフォルトの名無しさん :2010/08/30(月) 22:07:43
64(2**6) < 10**1(100**1) < 128(2**7) 8192(2**13) < 10000(100**2) < 16384(2**14) 524288(2**19) < 1000000(100**3) < 1048576(2**20) 数字3つを記録するのに21bitは多く,20bitもあれば十分であることがわかる あとは100**10のときの上界と下界を求めれば必要なbit数は導き出せる
355 :
デフォルトの名無しさん :2010/08/30(月) 22:09:03
1行目の「10**1(100**1)」は「100(100**1)」の間違いな
int a[ 10 ] = { 0 }; を int a[ 10 ] = {}; って書くのは正式な仕様ですか?
C++ではそうだよ
int a[0]; という配列は定義できますか?
できないです
★絶★対★無★理★
>>354 それがその上のほうで出てる66とか67だよ
ヘッダインクルードだけで使えるとか、 そんなに重くない(1MBもいかない)のをリンクするだけで使えて、 JavaScriptやLispなどの文法で 最低限、条件分岐と、四則演算と、簡易な文字列制御と (C++アプリ側での定義済みの)関数の呼び出しができる、(欲張りか) インタプリタ的なプラグインを実装できるという 都合のよいライブラリをオススメを教えてください…
Luaとか?
もうD言語でいいんでない?
Qtとかどうか
>>358 定義出来ないことを利用して
static_assertを書くことができるよね。
>>367 Boost.Pythonは確かにすごい。
struct C::B; struct A { C::B* b; }; namespace C { struct B { }; } これ通らないんですが、解決する方法ありますか?
なめsぱせ C{stるctB;} stるct A{C::B*b;} なめsぱせC{stるctB{};}
テンキュウ
派生クラスのポインタから、基底クラス名を取得するにはどうすればよいのでしょうか。
無理
> 派生クラスのポインタから、基底クラス名を取得するにはどうすればよいのでしょうか。 > typenameじゃないん? C++スレにいるとは思えないな
378 :
デフォルトの名無しさん :2010/09/02(木) 00:11:23
クロスキャストで困ってるんじゃないかな
>>373 C++にはリフレクション機能ないでしょ
380 :
デフォルトの名無しさん :2010/09/02(木) 00:29:24
基底クラスのクラス変数に基底クラス名を持たせる
>>373 こうですか?わかりません><
普通に考えて基底クラスの型を得るメタ関数教えろってことだろ。なんでいちいち曲解するかね
is_a
>>382 お前の頭がおかしい。断定するな。
多くの人がそう思うならそれは曲解じゃない。
質問者もそうは思っていないかもしれない。
なぜ断定できる?え?なぜ?
お前=質問者じゃないと断定は不可能だ。
なぜってそれが普通だからだよ 質問者はそうは思っていないかもしれないけどな
クラスのオブジェクトを返す関数はやめるべきですか? 例えば、文字列 std::string を返す関数は、何も考えないで書くと、 std::string hoge() { return "hoge"; } になると思うんですが、 void hoge(std::string &dst) { dst = "hoge"; } という感じで返してるソースを見かけました。 後者の方が効率的なんですかね
最近のコンパイラならムーブされるから気にしなくていいよ
>>385 > なぜってそれが普通だからだよ
普通も何も、お前一人がそう思っていて、
他の人がそうレスしていないんだから、
少なくとも曲解というお前の指摘は的外れだろう?
そうは思わないか?
>std::string hoge() { return "hoge"; } なんども無駄なコピーされるね
「普通」を根拠にする技術者は信用できない。 たいていは「俺は」と言うべきところの多数派工作。
>>386 前者は必ず新しい領域の確保が必要。
後者は確保済みの領域をそのまま使える。
小さなループ内で繰り返し呼び出すのなら、
後者のほうが効率が良くなる可能性が高い。
const char * const を返した方がマシなんじゃ
>>388 他の人ってどのみち数人じゃないか
そもそも同意レスが大量に付くレスが『普通』なの?
ついでに言うと俺は
>>382 じゃない
だから俺一人がそう思っていると思っているのはお前の思い込み
それはconst int を返すような無意味さではと
そもそも元質は文字列リテラルに限定した話をしたいのだろうか。
だからムーブされるから気にスンナつってんだろ 参照渡しとかどんだけ全時代のコンパイラつかってんだよ
401 :
デフォルトの名無しさん :2010/09/02(木) 12:14:26
>>400 すまん、ムーブされるってなんだい?
用語の説明頼む・・・。
アセンブラではmovは単なる値のコピーなので、
ついついコピーと変換されてしまう。
>>401 unique_ptr と勘違いしてるんじゃまいか
>>401 説明はめんどうだ
ムーブセマンティクスでぐぐれアホ
0xでの話だろ スレタイ読めますか?
>>404 は?スレタイのどこにC++03限定って書いてあるの?
ここはC++全般に関するスレなんで0xも余裕でありだよ
ほう、そんな合理的なことができるようになってるのか これならstaticの呪縛から開放されてstd::string返り値とかもやり放題だな
>>386 くらいなら0xじゃなくてもコンパイラが最適化してくれそうだけど
386すげーな
>>386 のコードじゃムーブセマンティクスは使えないんじゃ・・・
>staticの呪縛から開放されて ひょっとして const string & func() { static string s; /*〜*/; return s; } みたいなことしてそうでこわい
>>410 一般的な代入と同じように記述できる、staticを使う方法と同じくらい
容易でよりスマートな方法があれば別だけどまだ俺には見つからないからね
>>409 使えるよ。つーか必要なのは string の内部だよ。
既にそう実装されてる処理系もあるよ。VS2010とかね。
すみません、初心者質問なのですが、 サーバーでリクエストを待って動かすようなプログラムを 1PCで4〜5個同時稼動させたいと思っているのですが、 1つの実行ファイルに処理を纏めるのと 複数の実行ファイルに分けそれらを同時稼動させるのとでは どちらの方が開発・動作(安定性)的に良いのでしょうか? そもそもUNIX・LINUXは複数同時稼動できたり、適しているのでしょうか。 複数に分けた方がマルチコアCPUを活用できるという話はガセでしょうか? 些細な情報、ご指摘、何でも構いませんのでご助言頂けますと幸いです。
>>413 * Unix/Linux(それ以外マルチタスクOSでも)複数プロセスは同時に走らせられる
* cpu/コアが複数であれば同時稼働スレッドを増やした方が有効活用できる
(そうでないと1つのコアだけしか実質動かない)
* 単純に分けて走らせる(たとえば同じのパラメタ変えるとか)だけで良いの
ならその方が楽で普通効率も良い(人的にもコンピューターにもマルチスレッ
ドのプログラミングのオーバーヘッドが無い).マルチスレッドプログラミ
ングの経験が無いならなおさら.
久々に着たのにまた荒れまくってるなw 相変わらず低レベルな人間が多い。 俺は無駄な書き込みして逃げよ。
417 :
413 :2010/09/02(木) 16:52:23
>>414 マルチスレッドプログラミングの経験・・無いですので
単純に分けて走らせる事にします。
そこそこ無駄なオーバーヘッド(?)というのか同じ内容をメモリに溜め込む
形になりますが、他のコアが利用できないなんて事より、格段にマシでしょうから。
解りやすいご回答、ありがとうございます。方向性が定まりました。
struct Test { }; Test foo() { return Test(); } void bar() { const Test& t = foo(); /* t を使った処理 */ } これって問題ない? それとも寿命切れ?
int main() { return main(); }
寿命切れ
423 :
デフォルトの名無しさん :2010/09/02(木) 19:58:25
問題ないがダサい
多次元配列(のようなもの)を動的に確保することを考えているのですが、 極力配列変数の書き込み/読み出しに費やす計算時間を小さくしたいです。 今のところ領域を int** array; array = new int*[N]; array[0] = new int[M]; for(int i=0;i<N;i++) array[i] = array[0] + i*N; と確保してそれから必要な時にarray[i][j]とアクセスしていますが、 もしかしてこれより速い方法ってあったりします?やはりこれが最速ですか?
425 :
424 :2010/09/02(木) 20:48:01
すみません、 array[0] = new int[M]; // 誤 array[0] = new int[N*M]; // 正 です。
426 :
424 :2010/09/02(木) 20:50:31
for(int i=0;i<N;i++) array[i] = array[0] + i*N; // 誤 for(int i=0;i<N;i++) array[i] = array[0] + i*M; // 正 スレ消費して済みませんorz
int *array; array = new int[N*M]; 必要な時にarray[i*M+j]とアクセス
newだから動的とかそういう問題じゃないと思うんだ
ん? NとMがコンパイル時に決定していないという意味だろ それを動的というのか遅延評価というのかは知らんが
そもそもnewは遅いからmalloc使うべき
そこはそこまで高速化をする価値のある部分なのか?
>>427 意外とそっちが最速かもな
一番コンパイラの最適化の恩恵受けられそう
namespace ps3 { namespace pad { class Pad; } namespace sound { class Sound; } namespace draw { class Draw; } } 名前空間使うときは上と下どっちがいいですか? namespace ps3 { class Pad; class Sound; class Draw; }
>>423 どう書くとダサくない?
コピーコンストラクタでコピー?
436 :
デフォルトの名無しさん :2010/09/02(木) 22:12:30
419 の情報だけでは何とも言えないが たとえば引数ってわけにはいかないのか?
437 :
362 :2010/09/03(金) 02:03:21
亀スマソ
レスThanksです!
>>363 そうそうこんなの!
手軽でいいっスね!!
>>364 ,365
DとかQtは違うような…
>>367 ,368
おっと、そんなものが…
boostの中の人は本当に変態さんだな まあそもそも(ちょっと違うけど)言語をこねくりまわしてる段階の俺には言語を作るというのが意味不明だ
>>437 QtにはQtScriptっていうECMAscriptの実装があるんだよ
配置newで使われてる領域か使われてない領域か判断する方法って vectorみたいにこっからここまでっていう目印をつける オブジェクト1つに対してフラグになるものも余分にひとつどこかに用意する ほかになんかいい方法ありますか?
444 :
440 :2010/09/03(金) 16:01:28
>>441 ,442
すいません。息が臭い人には訊いてませんのでお引取りください
>>444 すいません。息が臭い人には訊いてませんのでお引取りください
たぶん何割か自演
ここまで俺の自演
>>430 どこの糞コンパイラでそんなことになってんの?
後者は確保済みの領域をそのまま使うっていうのは、stringのインスタンスの話で、リテラルのほうじゃないんですよね?
>>449 mallocよりも遅くないnewを搭載したコンパイラがほしいです。
>>451 確保にかかる時間を clock() で計ってみた。
http://codepad.org/22ViLVxO Cygwin g++
g++ (GCC) 4.3.4 20090804 (release) 1
----
malloc: 1408
operator new: 1454
malloc: 1463
operator new: 1204
malloc: 1155
operator new: 1331
----
Visual Studio 2008 Express Edition
----
malloc: 361
operator new: 233
malloc: 313
operator new: 312
malloc: 357
operator new: 420
----
誤差程度の違いしか見られない。
>>452 わざわざ測定した意味が分からない。
newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
誤差程度だろ いちいち細かい奴だな 将来禿るぞ
>>453 どういう理屈?
new が malloc() を呼び出すという実装を決め付けて言ってないか?
しかも関数呼び出しですごいオーバーヘッドが発生すると思ってる?
お前の処理系はデフォルトコンストラクタを呼ばない糞か
コンストラクタがあるクラスを malloc() で確保して「new より速い(キリッ)」とか言っちゃうわけ?
>>457 > newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
何を恥ずかしいことを
newなんてオーバーロードすりゃいいじゃんね
460 :
デフォルトの名無しさん :2010/09/04(土) 10:53:03
意味合い的にはオーバーライドっぽくもなるな
>>440 質問は "メモリプールの使われてる領域と使われてない領域を判別する方法を知りたい" だよね?
ないんじゃないかなー
前者のほう(に基本的には似てるfree listって手法)が広く使われてると思うよ
struct B { static void test(){} }; void (*func)() = B::test; func(); void (*func)() = &B::test; func(); これどっちも同じ結果になるんですけどどちらが正しいのですか?
少なくともvcでは下じゃないとエラー(警告だっけ)がでないっけ
VS2008じゃどっちでも平気だな。
そもそもどっちもエラーになる理由が無い
VS2010でもどっちでも平気だな
/Za /Wallでも出ないな
ごめんなさい staticで全然違ったようです
>>455 mallocとnewのヒープ確保処理の内容って同じじゃないの?
>>470 確保できない場合の動作以外はほとんど同じ要件なので根っこは同じ可能性が高いけど、
同じとは限らない。
同じ要件の処理であれば、十分に最適化されていることを前提として、差が出る理由が無い。
この点で
>>430 が何を根拠に「newは遅い」と言ってるのかわからない。
そもそも
>>424 は確保済みの配列へのアクセス速度の話だよね
struct Boo { Boo() : b( 111 ){} int b; }; struct Foo { Boo boo; int f; }; Foo foo[ 100 ]; fooの全要素のFoo::fが0、Boo::bが111になるような初期化方法はありますか? Fooにはコンストラクタが追加出来ないとして。
Foo foo[ 100 ]={0};
>>473 boost::value_initialized<Foo> foo[ 100 ];
>>474 > Foo foo[ 100 ]={0};
| こいつ最高にアホ | 同意
\ \
 ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
∩_
〈〈〈〈 ヽ /  ̄ ̄ ̄ ̄ \
〈⊃ } /、 ヽ
/ ____ヽ|__| |ヘ |―-、 |
| | /, −、, -、l ! ! q -´ 二 ヽ |
| _| -| ・|< || | / ノ_/ー | |
(6 _ー っ-´、} / \ | /
\ ヽ_  ̄ ̄ノノ/ O=====|
/ __ ヽノ / / |
(_|__) / / / |
478 :
476 :2010/09/06(月) 14:36:44
>>477 0xならおkなのか。
| 俺が最高にアホだった | 同意
\ \
 ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
∩_
〈〈〈〈 ヽ /  ̄ ̄ ̄ ̄ \
〈⊃ } /、 ヽ
/ ____ヽ|__| |ヘ |―-、 |
| | /, −、, -、l ! ! q -´ 二 ヽ |
| _| -| ・|< || | / ノ_/ー | |
(6 _ー っ-´、} / \ | /
\ ヽ_  ̄ ̄ノノ/ O=====|
/ __ ヽノ / / |
(_|__) / / / |
潔し
はやく0xに完全に対応したコンパイラでねえかなあ まあ規格自体が決まってなくてアレだけど
いつも思うんだけどコンパイラって物凄くね? 業界が業界なら普通に数万〜数十万円するくらいの技術が詰まってね?
実際に10万ぐらい支払っているわけだが。 まぁコンパイラだけでってわけでもないけどね。
特定のスレから特定の検索語、日付、ID等で該当するレスを抽出するプログラムを作ろうとおもっています。 スレに対応するdatファイルを引数として受けるクラスを作成し、そのクラスの中で uint SearchWord() uint SearchDate() uint SearchID() といったメソッドを定義し、おのおののメソッドがスレを1番から1000番まで通しで検索、 その結果条件に該当するレスナンバーを返し、最後に全てのメソッドが返したレスナンバーの ORを取れば全ての条件を満たすレスナンバーが抽出できるという算段です。 おそらくこれがもっとも直感的な方法かと思いますがC++が持つクラスの機能等を使って より洗練された拡張性のあるプログラムにすることは可能でしょうか? プロ級のみなさんでしたらどういうプログラム構造にするか教えて頂けないでしょうか?
それひとつしか返せなくね?いいの?
map と string を使った小プログラムを作りましたが、意図どおりに動作しません。
map.insert() でpair<string, string> のデータを追加しているのですが、 どうも map に追加されていないようです。
なにが悪いのでしょうか
http://codepad.org/FbsbG9pI 実行例
$./a.exe
Add, List, Quit? : A
name: test
tel: 123
Add, List, Quit ? :L
Add, List, quit ? : <- データを全表示させているつもりだが、全然表示されない。
お知恵をお貸しください。よろしくお願いいたします。
>>485 mがdoのスコープの中で作って消してを繰り返している
からではないだろうか
487 :
483 :2010/09/06(月) 21:04:51
>>484 ああ、失礼orz
uintを返すのではなくクラスフィールドのuint型の配列に結果を反映させるメソッドと思ってください。
488 :
485 :2010/09/06(月) 21:11:42
>>486 map の宣言の位置を変えることで、意図どおりに動くようになりました。
なるほど、おっしゃるとおりでした。
簡単なテストプログラムで行き詰ってしまい、どうにもこうにも仕方がないところでした。
アドバイス感謝いたします。
490 :
483 :2010/09/06(月) 21:24:41
>>489 > なんか微妙な設計。
ですよね(´・ω・`)
そこでC++に精通されている皆さんはどう設計されるのか知りたかったもので・・・
>>490 検索結果を内部にもってるってのがいやな感じ。
三つのメソッドを呼び出して、それぞれの結果を中にもってるって状態を持ちすぎのような。
中に持つわけじゃなくて vector<uint> みたいにして返すなら自然じゃないかと俺は思う 重複する検索だけを考えるなら既に見つけたのは無視みたいこともできるけど 拡張性とか自由度考えるとそれでいいような気がする (たとえば OR でも AND でも検索できるようにするとか)
別スレッドで並列処理するならともかく 結果のコンテナは一つでよくね? ORで全ての条件を満たすというののも不明だし。
>>490 普通にコレクションなり、イテッレータなりを返すだけだと思うけど。
なんでこんな気持ち悪い実装にしなければと思ったのか、
そのあたりを明らかにしないと有意義な回答は得られないと思う。
フィルターでふるい落とす方が複数条件の場合検索する数が減りそう
イテレーター作るときってとりあえずSTLのルールに準拠するもんなんですか?
イテレーターとかvector<uint>のほうが軽いけど、 2chのスレ程度なら、書き込みをばらして、それをコレクションとして扱って Articles result = articles.searchWord(…).searchId(…).searchDate(…); とかやっても十分動くとは思う。 (C++だとコレクションを返すとかやりにくいのかな?)
498 :
483 :2010/09/06(月) 22:59:02
vector<uint> SearchWord() vector<uint> SearchDate() vector<uint> SearchID() のようにvector型の配列を返すメソッドにし、最後にそれらのANDを取るというのがスマートな方法ということでしょうか?
こんなのは? vector<レス> スレ; list<レス*> 結果; Set(スレ, &結果);//全部ポインタ埋める list<レス*>::iterator last=remove_if(結果.begin(),結果.end(),PredWord); last=remove_if(結果.begin(),last,PredDate); last=remove_if(結果.begin(),last,PredID); 結果.erase( last,結果.end()); 叙述関数を一つにまとめてORにも対応させた方がスマートだろうけど。
>>473-478 C++0x だとデフォルトコンストラクタしかないクラスが 0 で初期化できるの?
>>500 struct BasicStruct {
int x;
float y;
};
struct AltStruct {
AltStruct(int _x, float _y) : x(_x), y(_y) {}
private:
int x;
float y;
};
BasicStruct var1 = { 5, 3.2f };
AltStruct var2 = { 2, 4.3f };
とかが可能
配列はシラネ
502 :
デフォルトの名無しさん :2010/09/07(火) 13:24:43
定数ってあるじゃないですか? effective c++によると#defineよりenumやstaticを使えって 書いてあるじゃないですか? 例えば定数の1から10までを名前のある定数にして 11以上を数字そのものが定数の名前にするには どうやるもんですか?
503 :
デフォルトの名無しさん :2010/09/07(火) 13:42:26
>>502 #define は定数ではない
たとえば #define a b() で case a: はできない
その 11 以上ってのは本当に「定数」か?
他の何かから演繹される数値ではないのか?
enum{ X_CARROT, X_SANDAL, … X_11, X_12, … ってことか?頑張って手動で入力するしかないんじゃ無いだろうか
例; //1から10の場合 T a =ONE T b=TWO 11以上の場合 T c=11 T d=12
506 :
デフォルトの名無しさん :2010/09/07(火) 14:19:03
typedef enum _tag_XXX : int { a, b, c = 8, d, e, }XXX; こんなんじゃだめかいね?
というか#defineではできるような口ぶりだが それってどういうことだ?
#defineをつかうなら #define ONE 1 #define TWO 2 ... #define TEN 10 とやれば 11以上は普通に数字が使えるでしょ。
もしかして static int ONE=1; static int TWO=2; ってやればいいですか?
enumやstatic constでも一緒 普通に数字が使えるよ
あっそうなんですか。 ご迷惑おかけしました。
static_assertのイディオムみたいに、コンパイル時プログラミングで独自の警告を出したいんですけど可能でしょうか? たとえば template <class X> void func(void); が実体化したときに Xが組み込み整数以外ならコンパイルエラー Xが非負なら警告 みたいな感じでやりたいんですが
513 :
デフォルトの名無しさん :2010/09/07(火) 15:49:12
Express Editionではエクセル読み書きできないのね。ガッカリ、、 さらにMFC付のstandardEdition買おうと思ったら売り切れてるし。 javaみたいに、そういうクラスって何処かに転がってない?
>>512 template <class X> class Y { public: enum{ Z = -1 }; };
template <> class Y<int> { public: enum { Z = 1 }; };
template <class X> void fun(void) { typedef char dummy[Y<X>::Z]; };
int main() {
fun<int>(); // OK
fun<float>(); // error
}
こんな感じ?
警告は無理じゃね
動的に(インポートライブラリ無しで))DLLの関数を呼び出す必要がありまして、その関数は dll_func( A* a ); という感じなんです。 Aというのは、クラスでもPODでも良いのですが、これはhoge.hに定義されています。 メインの方は、dll_funcを呼び出してAを渡すだけです。 DLLを作成するのは不特定多数です。 という状況なのですが、もし仮にhoge.hのAの定義を変える必要があった場合、 不特定多数のDLL製作者全員に、新しいhoge.hで再コンパイルしてもらう必要がありますよね。 こういった事態を防ぐ、何か上手い方法はありますでしょうか。
>>515 a) stdio.h の FILE 構造体みたいに、DLL 側で構造体を確保・解放し、中身に触れてはいけないことにする
b) BITMAPINFOHEADER 構造体みたいに最初のメンバに構造体のサイズを入れさせ、受け取り側がどのバージョンのヘッダを使っているのか判断できるようにする
c) 元の dll_func と A はそのまま残して、 dll_funcEx と AEx を新しく定義する
d) A の定義は変えず、メンバの解釈を変えて (BOOL って書いてあるけど実は INT でした!)、強引に必要なデータをねじ込む
517 :
516 :2010/09/07(火) 19:13:26
ごめん。 良く読んだらDLL作る方が不特定多数なのか。 じゃあ a の案はナシで。 代わりに e) 構造体の最後に新しいメンバを追加するだけなら前の部分は変わらないので、新しく増えたメンバは単に無視する
518 :
515 :2010/09/07(火) 20:02:54
>>516-517 いやはや、5案も挙げていただき恐縮です。
DLL側が変更無しでいけるという点で、e)案は魅力的ですねぇ。
結局、追加したAのデータには関係ないDLLにまで、再コンパイルを強いるのが辛いわけですから。
Aとして配列データなんかを渡さなければいけそうな…検討してみます。c)案も結果は似てますね。
d)はWinAPIにも良くある、予約してあるけど使用しないメンバみたいな感じですかね。
b)は安全対策という感じでしょうか。
お付き合いいただき、ありがとうございました。
templateとtypeidに関連する質問です。
A + B - D → A - B + D
` C - E ` E
同じ機能を持つが引数の型が異なる2つの関数(左側のB, C)を
1つに(右側のB)まとめたいのです。
http://codepad.org/rc48PS6D という形では、うまくいくのですが、
下記のように別の関数へ処理を渡すとコンパイルが通りません。
http://codepad.org/IqJI4gVf 実際には、この別の関数(右側のB)をstd::sortとするつもりでいます。
DとEはsortに渡す型毎のプレディケートとするつもりです。
以上よろしくお願い致します。
そりゃお前、Tの型はコンパイル時に決まっているからだよ。 お前のやっているのは、以下と同じだ。 void sub1(const vector<int>& a) ; void sub2(const vector<vector<int> >& a) ; int main() { vector<int> s; vector<vector<int> > d; sub1(s) ; sub1(d) ; // エラー sub2(s) ; // エラー sub2(d) ; } Tの型はコンパイル時に決まっているから、 vector<int>はvector< vector<int> >に変換できないし、その逆もできない。 お前の問題を解決するには、コンパイル時の条件分岐が必要だ。 C++ Template Metaprogrammingでも読め。
>>519 こうしたいのか?
template <class T, typename Predicate>
void foo(T oh, Predicate predicate)
{
predicate(oh);
}
int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);
foo(bar1, sub1<int>);
foo(bar2, sub2<int>);
return 0;
}
522 :
519 :2010/09/08(水) 00:00:57
レスありがとうございます。そんな感じですね。
>>519 のsort云々に合わせるとこうなります。
#残念なことにコンパイルは通りませんが。
sortに合うようにsub*は返り値を、boolにしてあります。
template <class T>
bool sub1(const vector<T>& a, const vector<T>& b)
....
template <class T>
bool sub2(const vector<vector<T> >& a, const vector<vector<T> >& b)
...
template <class T, typename Predicate>
bool foo(T oh, Predicate predicate)
{
return predicate(oh);
}
int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);
sort(bar1.begin(), bar1.end(), sub1<int>);
sort(bar2.begin(), bar2.end(), sub2<int>);
return 0;
}
523 :
519 :2010/09/08(水) 00:03:42
見返してみたら、せっかく作ってくださった foo使っていなかったりと結構おかしいことになってますね。 うーむ。
524 :
519 :2010/09/08(水) 00:33:05
>>524 1度テンプレートの実体化を頭で追いかけて、仮引数の型と実引数の型を見比べてごらん。型が食い違ってるから
527 :
519 :2010/09/08(水) 07:00:52
そもそも何でtype_infoを静的な型の比較に使ってるんだよ。 テンプレートでやればいいだろうが。
どうしてもこのコードだと動的に取得しなければならないと思い込んでた時代が俺にもありました 少し知識に毛が生えたら(少し工夫がいるものの)全く静的な問題でした
>>512 Boost.MPLを勉強すれば簡単じゃね。
>>512 ごめん警告は厳しい。
そういう意味の英語の型名を作ってコンパイラに表示させる様にするしかない。
>>527 http://codepad.org/WzgvDtWb こんな感じかな(エラーででてるけど、自分の環境でコンパイルしてくれれば通ると思う)
はっきりいって無駄が多いから素直にオーバーロード解決したほうがいいよ
ところで↑なんでコンパイルエラーになるかわかるひといる?
とくにおかしなことはしてないと思うし、VC++だと何の問題も無くコンパイルできるんだけど
selectが名前衝突してるらしいけどcstdioってグローバルにselect定義してんの?
doubleの演算って環境依存ですか? それとも何か間違ってるのかな。 double a = 0.052; double b = 1000; int c = int(a * b); //VC=52 BC=51 a *= b; int d = a; //両方52
0.052が内部では2進数の近似値になってるから
ってことは近似値の場合はコンパイラによって扱いが 違うってことですか。 一度doubleに入れれば同じ結果になるのに・・・。 気をつけます。
doubleは普通64bitだけど、FPUのレジスタに乗っている間だけ80bitになり、
メモリ上に戻すと元の精度に戻るらしい。
>>534 の挙動の違いはレジスタへの上げ下ろしのタイミングの違いじゃないかな。
不動小数関係は実装依存だったと思う。 さらに言えば、IntelとAMDで微妙に計算結果が違う事があるとか、 FPU使った時とSSE2使った時とで微妙に違う事があるとか… (VCではいくつかの関数はコンパイルオブションでFPUとSSE2を切り替えられたはず。他のコンパイラは知らない)
不動と浮動では真逆だな
>>525 わかってると思うけど一度 double に入れれば良いという問題じゃないからね
int casting を使ってる限りは切り捨て
四捨五入使えば一番近い整数になる
double は10桁精度があるといっても 51.9999999999 とかもありうるわけだから
そういうコーディングしていたら整数に精度は無い
541 :
540 :2010/09/08(水) 16:36:24
int c = int(a * b); //VC=52 BC=51 int e = (int)(a * b);
>>540 わかってたつもりでしたが、どうもわかって無いようでした。
確かにdouble に入れれば良いというのでは根本的な
解決にはなっていないとは思ってますが・・。
double a = 0.052;
double b = 1000;
double c = a * b;
int d = int(a * b); //VC=52 BC=51
int e = (int)(a * b); //VC=52 BC=51
int f = static_cast<int>(a * b); //VC=52 BC=51
int g = int(c); //両方52
int h = (int)(c); //両方52
int i = static_cast<int>(c); //両方52
int j = c; //両方52
doubleに精度や切捨ては知ってましたが
int e = (int)(a * b); //VC=52 BC=51
int h = (int)(c); //両方52
これが同じ結果にならないのが不思議で・・・。
これって実は全然違うキャストなんでしょうか?
>>537 、538
見逃してました。ありがとう。
なるほど・・。予想以上に少数を扱うのは難しいんですね・・。
int e = (int)(double)(a * b);
_control87(0x0200, 0x0300);
>>545 int e = (int)(double)(a * b);
やっぱりBCだと51になるようでした。
>>546 これは・・初めて見ました。
標準ですか?
int d = int(a * b); //VC=52 BC=51 int g = int(c); //両方52 これって何が違うんだ?
PCは小数苦手なんだよバカだからw だから整数で扱って、後で10^nで割ってやるのが末吉
552 :
483 :2010/09/08(水) 20:02:00
>>483 で2chの特定のスレ内を本文やIDや日付で検索をかけるプログラムに関して質問したものです。
あれからやや話を進めまして一レス単位で検索をかけていくにはどうしたらいいかということを思案しています。
基本方針は一レス全体の文字列
名前<>mail<>登校日<>ID<>本文
ごとをオブジェクトとして保存するクラスを作成し、そのクラスの中に検索用のメソッドを用意しようと思っています。
class Res
{
・・・
bool SearchWord()
bool SeachID()
bool SeachDate()
}
という感じのクラスが真っ先に思いつきましたが、それ以外に
553 :
483 :2010/09/08(水) 20:02:44
(
>>552 の続き)
class Res
{
・・・
virtual bool Search()
}
class Word : Res
{
bool Search()
}
class ID : Res
{
bool Search()
}
class Date : Res
{
bool Search()
}
という様に多態性を重視したクラスを設計するのも手かなと言う気がしてきました。
こうするとfor文で1レスから1000レスまでサーチをかける際、本文検索もID検索も日付検索も
同じ Seach() メソッドで行うことができるのですっきりとしたプログラムに仕上がります。
さらに本文、ID、日付以外にたとえばメール欄で検索をかけたくなったときとか容易に
拡張できます。
みなさんでしたらどう実装されますか?
>>548 >>537 (と暗黙的に
>>456 )が言ってるように、FPU上では80bit幅で計算されてる
VCしか持ってないから妄想で答えるけどBCCで前者をやると80bit幅のまま、FPUスタック上からfist命令か何かで直接整数に変換してるんじゃないかな
VCは一度(メモリの)スタックに書き出すようにしてるから結果は後者と同じになる
原因がこの場合、
BCCで使えるか知らないけど_control87関数で64bit幅で計算するようにFPUを設定しておけばこの違いはなくなるはずだよ
それかVC BCCともにコンパイラオプションでSSE使うようにするとか?
>>553 それじゃIDで検索したレスを日付でさらに検索したいとかするときわざわざResオブジェクトを
コピーしなきゃいけなくなるじゃないか
レスクラスをコンテナに突っ込んでfind_ifのファンクタいじるかたちで実装しろ
558 :
483 :2010/09/08(水) 22:14:14
そうしますと
>>552 の様にレスクラスを作り、その中で各種検索をかけるメソッドを実装するという
方法が一番いいでしょうか?
そういうことに悩むならC使ったら?
memcpyだとそのままコピーになってしまいますが、 コピー元の開始位置を指定できる関数ってないでしょうか? 文字列にヌル文字が含まれてるのでsubstrが使えません。
memcpy(dest, src + 5, size)みたいにすりゃいいんじゃね? つーか、std::string使いなよ。
>>561 ありがとうございます。それでなんとかなるんですね。
std::stringに代入するとたとえばaaaaa\0\0\0eeee\0のようなchar配列はaaaaaで切れてしまいませんか?
切れない
>>563 stringでいろいろ試してみますありがとうございます。
仮想関数をインライン宣言してはいけないと聞いたのですが何故ですか? 何か悪いこと起こりますか?
別に問題無いけど、仮想関数として使うときにはインライン展開はされないよ
>>552 なんで Res のクラス内に検索入れるの?わかんない
Res の集合(vector とか)をベースにしたクラスならわかるけど
Res は既に日付持ってるんでしょ?
>>568 Foo のメンバ変数は一つなんだよ
コンパイラ通らないっていうけど、C++0x に準拠したもので試してるのか?
>>569 メンバ変数は boo, f の二つだよ?
>>569 >>473 C++0x なら Foo foo[ 100 ]={} でいいだろ。
>>474 のように 0 を書いちゃうと、 boo を 0 で初期化することになって、
Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
>>571 >Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
C++0xの話だといってるのに・・・
573 :
デフォルトの名無しさん :2010/09/09(木) 14:08:30
0xスレに移動したほうがいい話題じゃねえか?
ちょっと今イテレータの勉強してて、全要素を巡回する基本的なイテレーターに対して 特定の条件を満たす要素を巡回するイテレーターを作りたいと思ってるんだけど 1:まったく別の新しい型としてイテレーター型を実装する 2:型消去を使って隠蔽する 3:アダプタをかませる とりあえずこんな方法が思いつくけど、どれも一長一短でいまいち 1はコードが重複するしクライアントがイテレーターの型を意識しないといけない 2はクライアントは楽だけどメモリ、実行効率ともに若干劣る 3は1よりコード重複が少ないけれどクライアントが型を意識しなければならない点は同じ なにかほかにいいアイデアはないですかね?
>>572 C++0x勉強中だけど、どのコンパイラなら
Foo foo[ 100 ]={0};
がエラーにならないの?その場合配列はどのように初期化されるの?
手持ちのgcc 4.3.3では-std=gnu++0x指定しても当たり前のように
エラーになるけど。
>>574 何がしたいのかか全然わからん
作るべきはコンテナじゃないのか?
577 :
575 :2010/09/09(木) 15:37:26
ごめん訂正。 ×手持ちのgcc 4.3.3 ○手持ちのgcc 4.4.3
>>574 やりたいのは boost::filter_iterator みたいなもの?
>>575 当たり前だ
その一行だけを書いて通るわけがない
エラーメッセージとか読めないのか
580 :
575 :2010/09/09(木) 15:50:46
>>579 その一行だけ書いてコンパイルするほどバカじゃないです。
コードは↓ですよ。
struct Boo
{
Boo() : b( 111 ){}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[ 100 ];
gcc は 4.5 でも 0x の一部にしかサポートされてないよ
582 :
575 :2010/09/09(木) 15:52:32
上の Foo foo[ 100 ]; ↓変更 Foo foo[ 100 ]={0}; でエラーになります。
583 :
575 :2010/09/09(木) 15:53:51
>>578 ググって見た感じそれっぽいすね(在るの知らなかった)
やりたいことはフィルターだけじゃないけど参考にしてみます
どうもでした
>>576 たとえば二分木なら幅優先で、深さ優先で巡回するイテレーター
あるいはノードを指定したらその子ノードのみ巡回するイテレーターとか
線形配列でも偶数値のみとか、1つおきにとか、逆順で、とかで巡回するイテレーター
同じコンテナのイテレーターといっても複数のバリエーションが考えられる場合があるわけでして
それらをひとつのインターフェースにまとめてかつ実行効率もそれなりに保ちたい方法は無いものかなと質問したんだけどはしょりすぎたかな…?
>>579 ,584みたいなのとは仕事したくないなあ…
>>585 それって、現存のコンテナは使えないわけだから、
新しいコンテナを作るってことであって、そのコンテナをどう作るのかって問題だよね。
>>585 reverse_iteratorみたいな感じにすれば?
>>588 そういうイテレーター作ったとしても、他のコンテナでは利用できないんだから、
イテレーターとしての存在価値はないでしょ。
イテレータは違う種類のコンテナに対しても同じように使えるからいいんだよ。
イテレータは今の物を使い、そういう動作をするコンテナを作ればよい話じゃないの?
>>586 この時間に2chしてる奴とも仕事したくないw
>>591 はイテレータというものを根本的に勘違いしている気がする
僕はすごくイテレーター
>>593 vector であろうが map であろうが同じコードで使えるのが重要
専用のコンテナでしか使えないイテレーターなんかイラネーヨ
>>595 やっぱりw
使い回しているのはイテレータではなくアルゴリズムだろ
>>591 ひょっとして異なるコンテナのイテレーターも同じひとつのクラスなんだって勘違いしてない?
>>596 アルゴリズム以前だよ。
どんなコンテナでも for 文で begin() と end() で回したりできるだろ。
イテレーターとはそういう物だよ。
君が抽象化の意味を理解できていなことはよくわかったぞ。
>>597 同じクラスでなく、同じイテレーターとして抽象化されてることに意味がある。
違う種類のコンテナでも同じコードでアクセスできるってこと。
専用コンテナでしか使えないイテレータでは意味が無い。
イテレーターである必要もない。
ポインタ互換のインターフェースを持ってるのはともかく begin()、end()で両端を取るのはイテレーターそのものの性質じゃなくてSTLコンテナのポリシーだろ
>>599 専用コンテナでしか使えないイテレーターってどれのこと?
そんな話題どこにも出てないと思うんだけど
next()しかないテレータもありえるという話?
>>601 そう抽象化だよ。ただしそれはコンテナの抽象化ね
イテレーターの抽象化ではない
今話してるのはイテレーターそのものについてなのよ
>>585 は1つのコンテナに(列挙順の異なる)複数のイテレータを作る、と言ってるんだよな?
もちろん個々のイテレータはSTLのイテレータとしての要件を満たすように作るだろうし、
そうすれば各種アルゴリズムにも使える。
>>604 そういうイテレータを作ることは可能だけど、
作ったところでそれをサポートするのは専用コンテナだけなわけで、
つまりイテレーターとしての価値はない。(イテレーターは抽象化されるのが前提)
イテレータである必要もない。
イテレータをサポートするコンテナw
>>607 >>608 けどそのイテレータを begin() では取得できないでしょ。
そのイテレータを返す専用メソッドが必要であり、
そのメソッドは vector には存在しない。
だからイテレータの種類を変えるのではなく、
同じ begin() で動作が変わるイテレータを返すコンテナを作ればいいと言ってるんだよ。
もちろんアルゴリズムでもそのまま使用できる。やりたいことはできるんだし、それが抽象化でしょ。
>>605 イテレータはコンテナを抽象化するための物だよ
幾らイテレーター自身を抽象化しても、元の目的が果たせなければ、全然意味ないよ。
>>611 begin()で取得できますよ。残念でしたね
>>612 イテレータはコンテナに属している必要は無いよ。
std::istream_iteratorやboost::counting_iterator、boost::filter_iteratorなんかが例。
イテレータは値の列の抽象化ではあってもコンテナの抽象化ではない。
>>611 rbegin
rend
についてどう思われますか?
これもイテレーターを返しますがbeginとendでないと認められないのでは?
>>613 は?
begin() は従来のイテレーターが返ってくるだろ。
それとは別の動作をするイテレータが必要なんだろ。当然別メソッドになる。
そうではなく begin() で従来のイテレータを返すんなら、
それは新しいイテレータを作るという話でなく、
単に新しいコンテナを作るという話だろ。
とりあえずイテレーターとコンテナを切り離して考えようぜ こいつらセットになることが多いけど本質的には関係ないからね
>>615 リバースイテレータ、コンストイテレータの類は異種のコンテナでも共通で使えるから意味がある
専用のコンテナでしかつかえない専用イテレータは本来のイテレータとは趣旨が変わってくる
イテレータである必要もない
自前のコンテナにイテレータ2種類作りたいけどどうしたらいい?って話じゃなかったのか とりあえず専用イテレータって表現やめてもらえますか おそらく「専用に決まってんだろ」って人と「専用じゃ意味ないだろ」って人が出るんで
>>618 専用のコンテナでしか使えない専用イテレーターってのがよくわからないんだけど
プライベートなイテレーターってこと?
ちょっと具体的に擬似コードでいいから示してくれないかな
template <Contaner, Iter> class xyz_iterator { Contaner *contaner; Iter iter; ... };
>>620 begin() で帰ってるイテレータとは別の種類のイテレータだから、
例えば nbegin() とかでしょ。
この nbeing() が他のコンテナには存在しないんだから、
それをサポートするコンテナは専用コンテナだってこと。
>>622 そうだねnbeginはそのコンテナ専用かもしれないね
でもそのnbeginが返すイテレーターは別にそのコンテナ専用でもなんでもないよね
それで特定のコンテナ専用のイテレーターって何なの?
>>619 元の質問は「その複数種類のイテレータを別な型にすべきか否か」だっけ。
動的にやれば同じ型にできるけど、オーバーヘッドがある。
例えばrbegin()とbegin()が同じ型のイテレータを返す、というやつ。
iteratorとreverse_iteratorみたいに探索の種類ごとに別々の型にしようとすると、
コンテナをどの順番で辿るかを型の中に書く必要があるけど、これは避けるべき?
という話だった。
つーかbegin信者は組み込み配列はどうすんの? array.begin()で先頭アドレス取れねーつうかコンパイルエラーだよね ポインタはイテレーターでないという解釈でいいのかな?
>>623 だからそのときにイテレータの種類を変えるのではなく、
begin() だけしか持たないコンテナを2種類用意(切り替えでも可)すればいいじゃん。
それがイテレータの思想でしょう。
>>624 幅優先と深さ優先の例だと、最後の位置が変わるから
別な型にするしかないんじゃ無いだろうか
>>626 せめてアダプタにしろ
それとイテレータの思想じゃねーよ
begin/endはSTLコンテナの思想だ
よく考えたら最後は共通した無効なものをさせばいいのか
>>627 は忘れてる下さい
専用、専用うるさい人はコンテナから独立している counting iterator について どういう見解を持っているのか知りたい。
>>626 同意
標準は曖昧すぎなのです。
明日会社休んで1日企画書と睨めっこして
標準委員会への具体的な提案を考えたいと思います。
同じ二次元のテーブル用に even_row_iteratorとかodd_column_iteratorとか diagonal_iteratorとかchecker_black_iteratorとか empty_cell_iteratorとかtitle_iteratorとか 目的別に作って使い分けたりしないの?
633 :
483 :2010/09/09(木) 21:43:01
>>567 > なんで Res のクラス内に検索入れるの?わかんない
オブジェクト指向というのはそういうものかと思いまして(;´Д`)・・・
> Res の集合(vector とか)をベースにしたクラスならわかるけど
検索は一レス単位で行うので検索のメソッドもResクラスに入れるのが常套かと思いまして・・・
レス単位で行われるのは検索じゃなくて 条件にあってるかどうかの判定だろ?
635 :
483 :2010/09/09(木) 22:32:47
くだらない質問かもしれませんが あるクラスについて、基本的にある型の変数のみをメンバ変数に持ち メンバ関数にはその型に関連が強い関数や元の型の痒いところに手がとどくような関数を入れる 例)CHWND h = hWnd; if( h.IsWindow() ) return; CTCHAR str1="abc",str2="abc"; str1 += str2; このようなたぐいのクラスには何か名前がついてますか?
637 :
デフォルトの名無しさん :2010/09/09(木) 23:35:37
>>636 プリミティブ型をオブジェクトとして扱うためのラッパークラスみたいなやつのこと?
>>637 ラッパークラスぐぐってみましたがまさにこれですね
ラッパークラスというのは耳にしたことはあるのですがこれがそうだったんだ
どうもありがとうございます
俺だったらアダプタにするかな
>>633 Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
返す関数を持たせておけばいいじゃん。
検索する関数はコンテナクラスに入れるのが普通だと思うけどな。
個々のResとやらが検索関数持っててもどう実装する気なのかな 他の Res の事なんか知らないはずなのに ちゃんと考えてるんだろうか…
javascriptのようなスクリプト言語をつくってしまい、 その言語で複雑な条件の検索をできるようにする。
643 :
デフォルトの名無しさん :2010/09/10(金) 16:46:59
組み込みDB使ったほうが早いだろw
644 :
483 :2010/09/10(金) 21:26:06
>>640 > Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
> 返す関数を持たせておけばいいじゃん。
おっしゃるとおりです。そう実装しようと思っています。
こんな感じになりますか。
for(i=0; i<1000; i++)
res[i].SearchWord();
たとえば res[1] とは1レス目を格納したクラスオブジェクトです。
1レス目から1000レスまで検索かけて検索に合致したレス番を収集しようと思っています。
>>641 そうなんですよね・・・
どう実装するかが問題でして。
レスクラスに本文、ID、日付等を検索する専用のメソッドを用意するか、
あるいは本文用のレスクラス、ID用のレスクラス、日付用のレスクラスを用意するべきか、
悩みどころです・・・
>>644 >643じゃないけどSQLiteでも使ったら? 好きなだけ検索方法を試せるよw
res.match_body() res.match_date_between() ...
ダブルディスパッチ,衝突判定でググって 上位にくるページのサンプルコードをg++(version4.4.3)で コンパイルしたところ,呼び出した関数がprotectedだって コンパイラに怒られました.なんで?
>>647 きっと呼び出した関数がprotectedだからだ。そうにちがいない。
なんで最低でもそのページのURLを書かないんだろう?イミフ
protectedだからな
protected は中途半端。 方針としては中途半端。 「見えちゃ嫌だけどちょっとは見えたほうが」 そんなの微妙すぎ。
652 :
647 :2010/09/11(土) 07:30:06
>>648 ,650
エラー通りだと思うんですけど,サンプルじゃprotectedになってんです
>>649 勝手にURI載っけていいの?
申し訳程度に改変して載っけると下のコードです.
適当な予想だとvc++では動くとか,動作は未確認でサンプル載っけたとか
class Hoge {
public:
virtual void Dispatch( Hoge* other ) = 0;
protected:
virtual void Action( Hoge_A* other ) = 0;
virtual void Action( Hoge_B* other ) = 0;
};
class Hoge_A : public Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Greet( other );}
virtual void Action( Hoge_B* other ) { Eating( other );}
}
class Hoge_B : Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Dance( other );}
virtual void Action( Hoge_B* other ) { Greet( other );}
}
>>652 URLも書いちゃいけないようなところを参考にするなよ、馬鹿。
>>652 VC++ でも protected の挙動が違うようなことは聞いたことがないなぁ。
たぶん確認せずに載せてるんだろう。
まぁ
>>651 ってことで、これにびっくりするようなら protected なんて使わなけりゃいいよ。
> class Hoge_A : public Hoge { > class Hoge_B : Hoge { 糞の役にも立たない自説を披露する前にこの辺を指摘してやれよ
>>655 最初の other->Action( this ) までで問題は明らかなんで、その先は読んでなかった。
あらためて読み直してそこや他もいくつかおかしい気がしたけど、やっぱりどうでもいい。
>>651 ,655
指摘された箇所と親クラスのprotectedをpublicにしたら,
それらしく動きました.ありがとうございました.
>しかし、インターネット掲示板を中心に、荒らし誘導目的の「晒し」や >誹謗中傷が少なからずウェブで行われているなど、 >「インターネットの知を豊かにする」というウェブの理念自体が >一部で形骸化している現実がある。そのような背景から、 >いわゆる「悪意のあるリンク」はモラル面から批判されることがある。
660 :
デフォルトの名無しさん :2010/09/11(土) 14:16:48
直リン禁止論とはまた懐かしいネタが出てきたなw
アルゴリズムの実行速度を測るにはどうやってやりますか?
>>661 アルゴリズムだけ入れ替えて実測する
プロファイラ走らす
>>661 アルゴリズムに癖があるなら、その癖を突くデータを用意したりする。いいほうと悪いほうと汎用なほうと。
そういうことじゃなくて 測るためのコードを教えてください。
絶対にいやです
>>664 C++では測定する関数が無いから出来ないと思った。
Javaならできる確か・・・
>>664 クラスにしても20行くらいだぜ?簡単だろ?
偉そうな小出し質問は嫌なもんだな C++でも関数あるでしょ - プラットフォーム依存性はあるが
>>664 確かC++でも出来ると思ったけど思い出せない。
あまり本とかに出てこないから詳しい人なら分かるかも。
機種依存以外だとclock()しかなくね?
測るためのコードってアルゴリズムの前後で時間とるだけじゃん
clock()以外にもあるだろ・・・・・ 思い出せないが。
データストラクチャーの大きさを測るにはどうしますか?
674 :
670 :2010/09/11(土) 17:08:21
すげーすげーかっこいいー!
boost に時間測るためのライブラリある
windowsだとQueryPerformanceCounterを使うのが多かった気がする
嘘を嘘と見抜けない人には2chは向いていないと思う
clock()もOS依存じゃないっけ? あれ。。。開発環境依存だっけな??
0xになれば標準で時間関係も使えるね
680 :
デフォルトの名無しさん :2010/09/11(土) 18:54:21
裏を返せば時計必須
なんか上の方で
>>253 みたいな
カッコイイ決めぜりふを残したガイキチがいたけど、
まるで同一人物の様だ。
皆さん秒が分かる時計持ってないんですね!
スローライフって素敵だと思わない?
>>668 それは俺も気になります
今は物理的(?)にfor内部に評価前関数自体が展開されるような自前マクロ作って使ってるんですが
なんだかウサン臭く思うので正式なのがあればそれを使いたい
面倒だからprofなりgprof、XCodeならSharkとか使えばいいじゃん。
教科書を書くだけの頭でっかちじゃない 現場のプロクラマーが主張するぜ コンストラクタとデストラクタ以外を protected にせずに インターフェース以外は private にすると再利用性の高いクラスが出来上がるんだぜ protected なメンバーをもつクラスを書くやつは間抜けに見えるんだぜ
>>687 privateだと派生先では使えなくなるわけだが、再利用性が高いってどういうことだろう。
派生先で元のprivateの機能を使いたくなった場合はどうすりゃいいんだ?
privateの機能を使おうとすんなよ
>>688 それがほんとうに必要なら派生元が派生先を使う、教える
必要で可能なら派生元を変える
class A {
void f() { g(); }
virtual void g() = 0;
int x;
void h() { h(x); }
virtual void i(int&) = 0;
};
>>689 いや、protectedは使わずpublic意外は全部privateにしろって話だろ。
要するにprivateな部分は派生先で全部実装し直せってことか。
ちょっと機能を変えたいって場合は、派生なんかしないで元を直せって話なのかな。
>>690 class Aが抽象クラスになっちゃってインスタンス化できないんだけど、それはいいのか。
利点がよくわかんね、俺protectedでいーや。
コンストラクタ以外は全部virtual public以外は全部protected privateは禁止 だろ常考
まあ頭がおかしいんならそれでいいのかもね
友達の事忘れてない?
->*がオーバーロードできるのに.*がだめなのはなんか深い理由があるの?
そもそも.*でオーバーロードが必要になる状況がありえないだろう。
>>697 ごめん間違えたは、何言ってんだオレは。
つーか、.*でもオーバーロードはできんだろ。
699 :
687 :2010/09/11(土) 23:30:01
protected なメンバーが必要な場合とは 派生先が派生元の機能を使うとき 派生元を派生先から使われる機能の集合として考えるのではなく 派生元は派生先で特殊化される、振る舞いの雛形として機能させる ここで最後に、「設計する」ではなく「機能させる」としたのが実務派のこだわり 可能ならば「機能する」ように設計を変えてしまうのも可ってこと キャラをすっかり忘れてたので適宜「だぜ」を付けて読んでね
>>688 派生元が持っているべき機能であれば、その機能をメンバ関数として提供する。
この場合、派生先だけに利用を制限する意味はほぼ無いので、 public でいい。
protected は「派生先だけに理由を制限する」わけだが、でっちあげでも何でも
派生クラスさえ作ってしまえば呼び出せてしまうので、カプセル化には寄与しない。
そもそも「派生元のprivateの機能」という考え自体も少しおかしい。
private であればそれは機能ではない。
オブジェクト指向とコンポーネント指向をごっちゃにした極論にしか見えない。
protected なんて使う奴は実装継承を平気でするような奴なので危ない。
CRTPやそのたもろもろ継承前提のクラスなんていくらでもあるだろ
704 :
687 :2010/09/12(日) 03:02:48
派生先が派生元の機能を使用しなければ そのクラスツリーはいつでも必要なときに簡単に分割できる 以下で、Aの派生クラスがAのprotectedなメンバーを参照していない場合は f と x は派生先への影響をあまり考えることなく、カプセル化を妥協することなく、BとCに分割できる class A { int a, b; public: void f() { g(a); } void x() { y(b); } private: virtual void g(int&) = 0; virtual void y(int&) = 0; }; class B { int a; public: void f() { g(a); } private: virtual void g(int&) = 0; }; class C { int b; public: void x() { y(b); } private: virtual void y(int&) = 0; };
>>700 の話で、なるほどと思ったんだけど、
>>704 の話は意味不明だな。
クラスツリーを分割するってどんな状況だよ、根本的に設計ミスだろそれ。
そこまでするなら派生なんか不要で、抽象クラスだけ使えってことになるだろう。
706 :
687 :2010/09/12(日) 03:51:07
>>705 まぁ
>>704 がすべてじゃなくて、そんなことも簡単にできるほど再利用性が高いってことね
それに設計ミスなんてよくあることでしょ
最初は分割不可能な機能群だと思っていたものが
良く考えてみると全く直行してることに気づくなんて、しょっちゅうあるんじゃない?
完璧になんてできないから、多くの場合に上手くいき、良い設計を導き勝ちなノウハウが重宝するんだ
>>696 お禿さんの本に書いてあったよ。どんな理由かは忘れたけど。
マイナス使わないから符号無し整数にすると計算が遅くなるとかないですか?
ないです
711 :
デフォルトの名無しさん :2010/09/12(日) 17:49:40
protectedは使わない派は要するに拡張はデコレーターパターンで行うべしって事でいいのかな? 基本てきに賛成だけど。
protectedなんか使っても、派生クラスが基本クラスの挙動をhackできるようになるだけで 特に良い事なんて無いからなぁ。
継承前提で作られたクラスではprotectedはけっこう便利でしょ テンプレートライブラリ書く時には普通に使うし
714 :
デフォルトの名無しさん :2010/09/12(日) 18:13:51
便利だけどスジが悪い人はすぐにクラスが爆発したり、 基底の挙動が把握せずに拡張するからバグの元ってことじゃない? やっつけ仕事には便利だけど、基本デコレーターでいきたいなぁ。
デコレーターって言葉使いたいだけちゃうんか デコレーターは実行時の動的拡張のためのパターンだ 静的拡張ならただの継承でいいんだよ
まあポリモしたいときはprotected使うよね
717 :
デフォルトの名無しさん :2010/09/12(日) 18:25:59
protectedを使わないで静的な拡張を継承で行うサンプルをよろしく。
protected変数禁止ってんならある程度賛成なんだがな
class Hoge { void func(); }; class HogeEx : public Hoge { void func_ex(); }; 拡張しましたよ
むしろprotected使わないと拡張できないと思ってる
>>717 がこわい
721 :
デフォルトの名無しさん :2010/09/12(日) 18:40:12
あーすまん、インターフェースに則った拡張でたのむ。 オーバーロードや新しいメソッドを継承先が作ったら抽象的にあつかえないでしょ。
void func() { Hoge::func(); }
class Hoge
{
virtual void func();
};
class HogeEx : public Hoge
{
void func_ex();
void func() { func_ex(); }
};
つーか抽象的に扱えなくても拡張は拡張だろ
>>721 の言ってることは意味不明
class Hoge { private: virtual void func(); }; class HogeEx : public Hoge { void func_ex(); void func() { func_ex(); } };
どうでもいいけどデコレーターパターンって破滅への予兆にしか見えない
726 :
デフォルトの名無しさん :2010/09/12(日) 19:21:10
>>723-724 機能階層と実装階層が分離できてなくてクラスの数が爆発したり、
継承した分オーバーライドしたメソッドの挙動がつかみにくくなるとおもうんだけど。
デコレーターはライブラリをhackしたい時ぐらいしか使わないような・・・
>>726 ではprotectedを使ったスマートな正解をどうぞ
NVI
>>726 べつに継承しなくても拡張すればクラスなり関数が増えるでしょ
それとvirtualにするってことはシンタックス的には派生クラスに何されても仕方ないって基底クラスが認めてるに等しいの
だから派生クラスの挙動を把握なんていちいちしてたら死んじゃうから何されてもいいように設計する
ま、完璧なコードなんて無いからしかたなくセマンティックス的に派生クラスを縛ってそこからもれなければ大丈夫なように基底を書くわけだけどね
>>695 友達なんていねーんだよ。さっしてやれ。
friend は protected 以上に厄介だと思う
クラスの特性を生かしたクラスを上手に作れないorz メンバが意味不明になっちゃうんだもん
>>734 雪駄とかゲッ他で20個とかになるなら、機能分離したほうがいいと思う。
自分流だが、機能別に細かいクラスを作って、統括するクラスで細かいの全部使うっていうのは結構やるな。
直交性を意識してメンバ関数(とその実装コード)を削るんだよ そんで必要なら後でひとつにまとめたラッパークラスを作る
雪駄とか下駄とかはデフォルトで省略可能になってれば良いんだよな それに総ての規定クラスの共通の祖先がないのがC++の最大の欠点
なんで欠点?
739 :
734 :2010/09/12(日) 21:28:29
どれをクラス化するかが難しいよね...
overrideキーワードが欲しい
>>740 0xでは属性ではキーワードじゃないがアトリビュートで追加される予定
> 0xでは属性ではキーワードじゃないがアトリビュートで追加される予定 0xではキーワードじゃないがアトリビュートで追加される予定
getter/setter が欲しいなんていうやつはクラスインターフェースを実装から逆に考えてるから危ない。
C++はどこまで大きくなるのかな〜
>>743 でも、C#のset、getみたいなのがあるとちょっと便利だよね〜って話でしょ。
templateで似たようなことは出来るけど、、、
できても要らんオーバーヘッドがなぁ
getとかsetが増えるのは設計が間違ってる兆候でしかないよ
748 :
デフォルトの名無しさん :2010/09/12(日) 23:13:00
>>747 get、setはどこから参照されているかわからないと困るから窓口設けておきましょってことだろ。
>>748 ゲッターセッターでラップしてもおんなじなんじゃないの。
>>748 パブリックフィールド晒すよりはマシっていうだけ。
多少はget/setも必要になるが、大半のメソッドがget/setってのはどっか間違ってる
誰もgetset増やすなんて言ってないけど
増やさないならgetter/setterなんて別にいらない どうしても必要な特定の部分に自分で書けば済む
753 :
デフォルトの名無しさん :2010/09/12(日) 23:37:08
1つのフィールドに対してゲッターとセッターの両方がある場合はたいてい設計ミス
極論過ぎてアホ臭い
最近の設計本なら普通に書いてある程度の事だよ
設計の天才は年寄りに偏る傾向にあるなんて話もあるが ここ何年かでようやくC++の効果的な設計の仕方みたいなのが 熟達者たちによってまとめられてるんじゃないかなあ。
理由:設計本に書いてあるから
別に下駄と雪駄かきまくって安心するのは勝手だけど そのうち新人に笑われるようになるから、勉強したほうがいいよ
>>757 ゲッターとセッターが両方あるなら直接フィールドを公開するのと対してかわらん
・参照元(関数を呼び出しているところ)の確認
・フィールドのアドレスを隠す
ぐらいの効果しかないだろ
誰もgetset増やすなんて言ってないけど
>>759 関数かませれば後で実装を差し替えることができるでしょ
たとえば参照回数をカウントする機能とかもはじめから関数なら後で追加するのも簡単
だいたい、あれだけpublic変数はダメと言われるのに ゲッターとセッターかましただけでもう安心なんておかしな話だと思わない?
座標を管理するクラスとかセッターとゲッター両方作る
その理論でいくと、STLのコンテナはおかしいわけだな。
STLのコンテナは格納したオブジェクトを勝手に変更したりするのか?しないだろ
コピーコンストラクタの実装によっては
あっそう
>>764 だから「たいてい」って言ったんだよ
コレクションみたいな場合は別だよ
どのレイヤーを想定してるのか知らんがデータクラスぐらい許容できんのか
ほんとにデータだけならstructにするべき なにか操作をもつべきでない
>>769 だめです!設計本に書いてありますから!
プログラマはほんまよく釣れるでぇ
1つのデータを複数で操作しないといけないような設計はできるだけさけたい だからpublic変数はやめろと良く言われているわけ。 そこにgetとset追加したら(もちろん後で変更しやすくなったり、バグが追いやすくなったりはするが) 設計としては根本的に何も解決してないことになる。
わかってないようだったから
それならば念のために書いておくが struct { int x }; こんなのにget/setが必要かなんていう話はどうでもいい。
要は ちゃんとカプセル化して使う人が困らない様にする(上手な設計能力が必要)か、 いっそ変数まで全部publicにして使う人は内部動作も理解してね!って言うか。 どっちかがベスト
rubyは?
privateとかprotectedとかは甘え
全部Public
structでも使ってろ
CとC++のキャストのうち、 中身の値が絶対に変更されることのないキャストって reinterpret_castだけという認識でいいでしょうか?
const_cast
structはそれ自体インタフェースだからget/setはいらない それはクラスにget/setがいらないって言うのとは全然別の話 やっぱりわかっていない
そんな話じゃなくて 全部publicにするなら、デフォルトがpublicなclass であるstructでいいだろ っていう単純な話だろう
結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ structはデータの所有者がclassと違って自分以外にどっか別にいるからgetsetがいらんてだけで
>>761 設定しようとした値以外の、内部状態が変わるようなのは、
雪駄下駄とは言わない。雪駄下駄が必要になるのは、二つ
以上の変数や構造体をアトミックに変更する必要がある場合や、
変数の値が変更された事を通知する必要がある場合に限る。
そんなの普通は設計段階で分かるだろって事だ。
getter関数の頭にgetってつける? googleさんはgetは付けないらしい setterにsetはつけるが
>>787 >設定しようとした値以外の、内部状態が変わるようなのは、
こっちが駄目で、
>二つ以上の変数や構造体をアトミックに変更する
こっちはOKだって。
こいつセンスないわ。
>>786 >結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
認識もなにも,C++ってそういう言語じゃないの
>>786 >結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
逆にお前がやばいぞ
793 :
デフォルトの名無しさん :2010/09/13(月) 10:46:46
set、getはフィールドに必ずつけるけど、 ほとんどの場合はgetだけpublicかな。 setは特別な状態を設定するとき意外はpublicにならないとおもう。
>>793 もうね、初級者が口挟まなくていいから。
>>793 そういう場合もあるだろうけど、それはむしろ特殊なケースでしょ
796 :
デフォルトの名無しさん :2010/09/13(月) 11:04:06
>>794 上級者はフィールドに直接アクセスしちゃうんですね!
カッコイイデスwww
>>796 思ったとおりだ、全然技術論が交わせるような相手でなく、ただのど素人だわ。
まぁ age てる時点でそういう感じがしたけどな。
799 :
デフォルトの名無しさん :2010/09/13(月) 11:52:28
>>797 上級者ぶるのはいいからお前ならどうやってのよ。
横からだが
>>793 > set、getはフィールドに必ずつけるけど、
なんで必ず付けるのか?
必要なものだけに付ければ良いし、多くの場合はクラス内部の
データを加工したものが必要なだけ
データを投げ込む時も内部でどう保持しているかまで知る必要は無い
802 :
デフォルトの名無しさん :2010/09/13(月) 12:45:08
読んで居て思うのですが? Sourceを出させた方が速い様な気がします…
つーか、なんで疑問形?
805 :
デフォルトの名無しさん :2010/09/13(月) 13:10:49
>>801 アクセッサを作るのはデバッグを楽にするためだよ。
そこにブレークしかければどこで使われているかわかる。
検索より確実。
>>805 あぁ public で変数晒してるのに比べればマシだね。
でも、みんなそんなところの比較をしてるんじゃないんだ。
わかってもらえないだろうか?
807 :
デフォルトの名無しさん :2010/09/13(月) 13:17:09
>>806 アクセッサを作ると何がまずいの?
説明よろしく。
横からですまん。 アクセッサでラップしておくことの利点は理解してるつもりなんだけど、 Pointクラスを持つWindowクラスが、ウインドウの移動(Move関数)を提供するのか、位置を指定(Setter)することを提供するのか という感じに、クラスによってはgetter,setterばかりになることもあると思うんだけども、その辺について聞きたい。
>>805 デバッグ中に入れるのはわからんでも無いがそんなものを
デザインに入れればクラスのカプセル化や柔軟性は失われると思うが
まさかデバッグ中だけの話をしてるわけじゃないよね?
810 :
デフォルトの名無しさん :2010/09/13(月) 13:29:00
>>809 アクセッサはpublicでないといけないルールでもあるのかよw
必要なものだけpublicにすればカプセルもこわれないだろ。
あとアクセッサで柔軟性云々は理解できなかった。
具体的な例をたのむ。
>>808 Move関数を提供、でおしまいな気がするんだけど、なんでそれが
「getter,setterばかりになる」例になるの?
>>807 アクセッサを作ることが問題なんじゃなくて、メンバ変数の存在に基づいてアクセッサを作ろうと
考えること、つまり実装の詳細に基づいてインターフェースを設計することに問題がある、という話。
多くの場合、そのような設計はカプセル化に反し、たとえばクラスの実装を変えるだけで
済むはずの変更がクラス利用者のコードにまで波及したりする可能性を高める。
>>810 private なアクセッサって、アクセッサ使わなくてもアクセスできちゃうから、
>>805 のような
利点は得られないよね?
CPUやその他環境にもよるがブレークしたいだけならアクセッサは必要ないし
>>811 日本語になってなかったですね。
Pointクラスを持つWindowクラスは、Point型変数の具体的な操作であるMove関数を提供するべき?
それともSetterを提供するべき?
.NETのライブラリではプロパティが多用されていることがあったので、どういう指針で決めたらいいか悩んでます。
言語側でプロパティのサポートがあるかないかという環境の違いなんでしょうか。
>>812 前半は同意だが後半はむしろ逆だよ
アクセサをはじめからおいておけばよほどのことが無い限りはクライアントに影響しないコードが書ける
class Hoge
{
int x;
public:
void Set(int xx) { x = xx; }
int Get(void) const { return x; }
};
↓
class Hoge
{
Impl * pImpl;
public:
void Set(int xx) { pImpl->x = xx; }
int Get(void) const { return pImpl->x; }
};
身近な例だとこんな感じね
>>810 public では無い場合にフィールドに必ず accessor が何故必要なの?
直接アクセスできるのに
つければ手間も増えるし class も煩雑になる
public にして他のもので使うことにすれば class 内の変更はしにくくなる
struct Hoge { FugaFuga fugagaaa; }; class Kaibutsu { Hoge hoge; }; こういう状況でメンバのhogeを任意の値で初期化するにはどういうコンストラクタを書くんですか?
まず Hoge のコンストラクタを書く
>>1-819 こいつら全部ダメ。C++の初心者さんばっかり。
C++ではsetter,getterメソッドなんていりません。
C++では全てのメンバをpublicにしておいて、
必要なときにメンバを新しいclassにすればいいの!
暗黙の型変換と代入の定義でいいの!
821 :
デフォルトの名無しさん :2010/09/13(月) 17:39:36
>>813 自分の中でどこからアクセスされるかものすごく明示的になっている時点で便利だとおもうけどね。
おれも以前はprivateについてはつくってなかったけど、いまはつくってるよ
822 :
デフォルトの名無しさん :2010/09/13(月) 17:41:45
C++で優しい入門本紹介してください サイトも紹介してくれるとありがたいです
824 :
デフォルトの名無しさん :2010/09/13(月) 17:47:44
ロベールでもよんどけば?
>>821 フィールドに必ずつけるって書いてるよね
>>793 フィールド一つ増やしたらまたアクセッサ付けるわけ?
ほとんど get は public ということは作ったフィールド減らしにくいよね
減らせますよ 最悪ダミーにしてもいいし
減らすの不可能では無いけど public にしたらその動作を変える とそれを使ってる class やコード全てに影響及ぶ よって、変えないかダミーにするとか 必要なくても全てに public な get を付けるのはそんなに賢いのかなぁ
賢くないけど、君の言うように致命的なミスではない
829 :
デフォルトの名無しさん :2010/09/13(月) 18:34:32
>>825 内部でしか使わないものはpublicなんかにしないよ、なにかんがえてんの。
外部で状態を参照したいものだけgetをpublicするんだよ。
なんでもpublicになんてしない。
>>829 だから初心者が口を出すなとさっき怒られたんじゃないの?
831 :
デフォルトの名無しさん :2010/09/13(月) 18:44:35
>>830 上級者はアクセッサごときでソースが煩雑になり管理できなくなるんですか?
>>829 >>793 > set、getはフィールドに必ずつけるけど、
> ほとんどの場合はgetだけpublicかな。
って書いてるからほとんど get は public なんでしょ
833 :
デフォルトの名無しさん :2010/09/13(月) 19:31:31
おれは必要なものだけpublicだとかいてるんだよ。 なんでアクセッサで煩雑になったり、拡張性が悪くなったりするんですかね?
そういやC++でも今はみんなフィールドやメソッドとかいうんだよな 職場でメンバ変数、メンバ関数とかいうのオレだけだ 他人に強制したりしないが良くは思われてないかもな もちろんC#やるときはそっちの用語使うんだが
上級者ならいっぱいいっぱいでやっと完成しましたじゃ済まないんですよね。 アクセッサが増えたら設計ミスなので、 何としても回避しなければ上級者とは呼ばれないでしょう。
>>834 アトリビュートとかメッセージとか言い出すよりマシ
アクセッサの定義が分かりません。 エラー値チェックとか、ストレージの抽象化とか、遅延読み込みとか、 ちょっとでも雑務が入ったらアクセッサとは呼ばないのですか?
雑務ができるようにアクセッサにするんですよね?
その前に雑務を定義してください
840 :
デフォルトの名無しさん :2010/09/13(月) 20:12:16
>>835 いまだにウォーターフォール式ですか、なんだ老害かよ。
日本でアジャアルはキツイものがある。
プロジェクトメンバーのレベルがそれなりに保証されてないと無理だからなぁ
アジャイル orz
アジャアルないアルよ
フィールドに必ず set/get 付けるって open source のコード見てもそんなの無いと思うけど ここで講釈してる人って公開されてるコードはレベル低すぎて話にならんって感じなのかな リアリティ感じないが
846 :
デフォルトの名無しさん :2010/09/13(月) 21:35:15
>>845 いきなり無い書いてんの、でなおせよ。
オレ様チャン知ってるオープンソースのコードは世界一ですか?
>>845 単に日本のPG/SEの脳が足りないだけだろう。
海外では頭が良いやつがちゃんと報酬のもらえるPG/SEになっている。
日本は頭がお粗末なやつがろくに報酬のもらえないPG/SEになっている。
>>847 海外のコーダーが書いたものについて言ってるんだが
リアリティって重要だよね で、具体的にどのオプソプロジェクト?
単純なget/setはクラスの内部状態を公に晒してるだけだから、極力なくせと言ってるわけ。 便利だから使いたいとかそんなレベルの話ではない
く ど い
なんで同じ話するわけ
ごめんね当たり前の話だったね
855 :
デフォルトの名無しさん :2010/09/13(月) 23:00:53
>>851 なんでアクセッサがpublic前提なんだよおまえは。
privateなら良いんじゃない
winnyはC++でwindowsネイティブで作られていましたが、 マルチプラットフォームにするためにqtやgtkを使って作られていたら 簡単にクラックやプロトコルの解析がされていましたか?
>>850 ここってC++のスレなんだけど RoRって C++で書かれてるの?
862 :
デフォルトの名無しさん :2010/09/13(月) 23:11:29
Javaのオプンソース物はかならずアクセッサついとるで。
で?
メジャーだから正しいってこともないと思うけどな、マイナーが正しいと言う気も無いが
Javaのオプンソース物が設計ミスってるんだよ!言わせんな恥ずかしい。
あっそ
C++の設計本が正しいに決まってるだろ!
隠蔽のメリットって内部の実装変えても外からは同じに見えるようにできることなのね。 ゲッタやセッタがたくさんあるとね実装が丸見えになって、内部の実装変えたときに動作が変わらないようにするのが大変なのよ
皆で一つのフィールドいじくりまわしたらそら混乱すらーな
それはアクセッサの問題じゃなくて設計自体の問題。
要するにpublicフィールド使って混乱するのは設計問題って意味か
全てはプラz、設定が悪いで説明できます
設計がマズくなるのを防ぐためにクラスとかprivateとかいろんな機能があるわけで
>>871 フィールド丸出しにしてるといろんな方法で操作できて統制ができなくなるんでデバッグ不能のバグの宝庫になる。
ゲッターやセッターがたくさんあると同じことだ
あんま使ってないから知らんけど、Visual C++等のIDEにさ、 アクセサ必要になったらhoge.aを使ってるとこを 全部自動でhoge.geta()に変えてくれるような機能ってないの? あればそれで解決じゃん
876 :
デフォルトの名無しさん :2010/09/13(月) 23:44:50
>>874 いや、アクセッサがあるからいけないってわけじゃねえだろ。
フィールドを沢山抱えていたり、むやみにpublicにしている設計がわるいんだろ。
思い込みでアクセッサはダメとかかいてんじゃねえ。
>>875 struct hoge{
__declspec(property(get=geta, put=seta)) type a;
};
アクセッサがダメというよりは、 アクセッサが増えるのは設計に問題がある兆候って感じだな
なんか猛烈に入り組んだ罵倒の試合になってるなぁ・・・。どうしてこうなった。
880 :
デフォルトの名無しさん :2010/09/13(月) 23:54:21
機能が肥大化している兆候ってことだよね。 アクセッサが悪いわけじゃねえよな。
いえ、アクセサが必要になった時点で設計ミスです。設計本に書いてあるんで。
無理やりのアクセサ擁護か
内部状態を晒すのが良くないのであって、機能の肥大化はまた別問題だろう
885 :
デフォルトの名無しさん :2010/09/14(火) 00:05:19
>>881 本に書いてあったんだもん!じゃなくてよ。
それを理解したお前の言葉でその理由をちゃんと説明しろよ。
あとその本を晒せ。
アクセッサ無しならもっとひどいことになるよね? 毎回引数でしていして受け渡し。。。
単に内部状態晒して自由に弄らせてるアクセッサが良くないってだけでしょ
「厳しめなオブジェクト指向の10箇条」 みたいなサイト(和訳だったか?)がちょっと前に貼られてたのだが思い出せない。 暇な人よろしかったら教えてください。
889 :
デフォルトの名無しさん :2010/09/14(火) 00:20:50
>>888 なんだよ、自分の言葉で語れるほど理解して使いこなしてねえのかよw
という糞な流れを変える程度には有意義なネタだったと思うのだが。
もうちょっと釣り耐性付けようよ。 | | | | | | | | | | || | | | | | レ | | | | | J || | | | | | J | | | し || | | | レ | | レ| || J | J し | | || J | し J| J レ /V\ /◎;;;,;,,,,ヽ _ ム::::(l|l゚Д゚)| …うわぁ ヽツ.(ノ::::::::::.:::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U' バカがC++でコード書いて会社が潰れようが それはそいつを雇った会社が悪いわけであって、 ちゃんと「C++でOOPやると決めた時にはOOPらしい正しい設計できる」やつらは むしろ他者は潰れてくれた方がいいじゃん。
うぜーなマ板でやれ
a
>>815 まず、 Windows クラスが Point を内部に持つかどうかという実装の詳細は関係ない。
そのうえで Move() 関数か、 setter か、どっちか呼び出し元のコードが自然になるほうを
選ぶといい。呼び出し元のコードがどうなるかに基づいて設計するのがポイント。
C# のプロパティはインターフェースを作る際の選択肢として、関数呼び出しの表記よりも
直感的な object.property = value というような表記を選べるようにしたのであって、内部に
そのようなデータを持っていることを前提としておらず、ここで非難されている、
実装を暴露するような getter/setter とは違う。その点で「言語側でプロパティのサポートが
あるかないかという環境の違い」という認識は間違ってないと思う。
private なアクセッサなら大丈夫だとか言ってる人へ。 みんな「アクセッサ」といえば public なやつのことだと思ってます。 private は好きにしてくれたらいいです。 public な get/set がたくさんあることに問題を感じるのであれば、 ここでほかの人と意見の衝突はありません。
>>895 だいぶ流れてたのにレスありがとう。
>そのようなデータ
というのは先ほどの例でいうとPointのことですよね?
Pointを内部に持つかということに関わっていたら実装を隠蔽できてないことになる、と。
既存のコードに、 private: friend class Test; int hoge; って定義してある場合、自前でTestクラスを作って、 hogeにアクセスするのはありなの?
あり
>>898 そうなってる場合はどっかに同じく「既存の」 class Test があるだろうから、
自前で Test クラスを作った場合、良くてコンパイルエラー、あるいはリンクエラー、
悪ければ ODR 違反による未定義動作でわけのわからない動作。
902 :
901 :2010/09/14(火) 07:50:54
ostream &operator<<(ostream &s, state &o) { ↓ ostream &operator<<(ostream &s, const state &o) { setの中身が直接書き換えられるのはまずいから
904 :
901 :2010/09/14(火) 08:20:45
bridgeパターンのimplementation *body はどこで初期化しますか? 初歩的な質問ですがおねがいします。
Abstractionのコンストラクタで初期化する あるいはAbstractionの切り替えメンバを用意する
コンストラクタで初期化する場合 実装はきまりきってるから ポインターにする意味なくないですか?
引数やテンプレートでスイッチできるでしょ
テンプレートならポインターじゃなくても スイッチできるんじゃないんですか?
できませんよ
できるでしょ
で き な い
静的なストレージに配置newを使えばできます
<template implementation >class Abstraction{ implementation body; Abstraction():body(implementation()) {} 出来ますがなにか?
できてますよ
うん 出来てるし 本にも乗ってる。
それじゃ新しいテンプレートクラスの実体化なしで実装切り替えらんねーだろカス クラス数の爆発を抑えるためのbridgeパターンだろうが 真逆の方向に行ってどうすんだハゲ
実装と定義の分離が目的じゃなかったっけ?
Impが10パターンあったらAbs<Imp>を継承したクラスを1つ作ろうと思っただけで同じようなクラス定義を10回も書かないといけないとか面倒すぎる
Abs<Impl , int>にするとか Abs2<Impl>を作るとかの発想は無いの?
継承先に継承もとの実装を預けるなんて設計がまともな設計だと思ってるのか?
テンプラにするとコピーも代入もできないじゃん
テンプレートだらけになって切り替えるのがだるそう
つーかそれブリッジじゃなくてポリシーだし
未だにテンプレートについていけない親父臭が漂ってるなwww
え?テンプレートをちゃんと知ってるからこの場では否定的な意見がでるんだろ
930 :
858 :2010/09/14(火) 20:37:17
できない
struct A { A():a(),b(),c(){} int a, b, c; }; struct A { A():a(0),b(0),c(0){} int a, b, c; }; どっちのコンストラクタがいいですか。
>>932 お好きにどうぞ。
私の場合、0という値に意味がないなら前者ですね。
structにコンストラクタは必要なんだろうか
A a; じゃなく A a(); って常に書くならむしろ要らんな
Cスタイルのほうが速そうなイメージがある デフォルトコンストラクタとか作られないんじゃなかったっけ
structはデータの集合以上の機能をもつべきでは無いのじゃないだろうか コンストラクタも振る舞いといえばそうだ
publicを書くのがめんどいからstructにしただけです。
メンバも継承もpublicなことが多いからstructのほうがタイプ少ないことが多いんだよね
酷い釣りだ
え?
?
>>944 >935の後者はPODかどうかに関係なく関数宣言。
struct はデフォルトがpublicなだけでclassと一緒らしいですが classでもメンバを適当にすれば POD型になるんですか?
はい
ありがとうございます
OSSのコードを読んでいると、メイン画面のGUIは手書きで ダイアログはGUIビルダーを使っているというパターンが多いと思います このメリットを教えてください
>>947 classの時点でpodじゃない。podが何の略か
954 :
951 :2010/09/16(木) 20:26:27
仕様書読め
perfect object domestic
POD、PoDとは、 * Plain Old Documentation (POD) - Perl等のプログラムソース内に記述されたマニュアルの記述方法。 * Plain Old Data (POD) - C++において、Cの構造体との互換性を持つクラスのこと。
内容があってるかじゃなくて ソースにwikipediaってのはどうなのよ
んで結局PODって何なの? 未だに定義を俺は理解できないんだけど。 だんだん理解しようとする気迫が薄れてきた。
Pod pod = {0}; で初期化できるのがPOD
ってことは別にメンバ関数もっててもPODなの?
うーん、定義的にはvirtualなメンバ関数でなければ、PODになるかな。 個人的にはメンバ関数持ってるPODなんて勘弁してほしいが。 staticメンバならいいけれども。
pod
boostのシリアライズっぽいやつで暗号化にも対応してるの無いっすか?
I am Pod
C用のstructを継承して大小関係とか少し拡張するのってありですか
>>966 全然おkじゃないのか?
何が聞きたいのか分からん。
それで設計がおかしくならないならいいんじゃん。
既にあるクラスの再利用なんだし、むしろそれが継承の醍醐味な気がするが。
>>967 いえ、自分まだ素人でして↑のレスを読んでると
そういうCの関数用のstruct、つまりクラスとか想定されてないところに
勝手にC++の付属物をくっつけるのがなんだか怖くなってきて
童貞みたいな発言だな
>>968 それがextern "C"とかで宣言されている外部の関数とかとやりとりするための
structなら、しないほうがいいかもね。
継承ではなくて、別のクラスにくるんで使う方がいい場合もある。
指針としては、dynamicキャストを使わないで(staticキャストはOK)、書ける間は
そんなに気にしなくていいんじゃないかな。
971 :
951 :2010/09/16(木) 23:58:49
>>958 間違ってました、全publicならpodにできますね
void p(){puts("ごめんなしゃい");}
int ackermap(int m,int n,void(*f)()){
f();
if(m==0){return n+1;}
if(n==0){return ackermap(m-1,1,f);}
return ackermap(m-1,ackermap(m,n-1,f),f);
}
ackermap(4,4,p);
>>970 >extern "C"とかdynamic_cast
聞いたことはありますがまだ実際に使ったことはないですね
普通に正式っぽいのでよかったです
問題にぶち当たったらまた再考してみます、俺みたいなヘタレにどうもありがとうございました
>>972 相当な初心者だったのか。
道はめっちゃ険しいけど、まあまあ楽しいし、頑張ってくれ。
>>970 dynamicキャストを使うなんて、C++のクラスだろうが何だろうが、逃げです。
デスマーチへの近道です。
しかし逃げだろうが納期からは逃げられないから
仕方なく最後の仕様変更の際には使うんです。
>>974 そして、結局どつぼにはまる、と…w
やっぱり手抜きしないでstaticキャストしときゃよかった、と泣くことになるんだろう?w
976 :
デフォルトの名無しさん :2010/09/17(金) 00:35:05
dynamic_cast がなかった頃にできたライブラリの地獄絵も 今に負けず劣らず凄惨を極める・・・今に負けず劣らず
>>976 それは、dynamic_castが必要だよ、とコンパイラがいわないから、もっとひどいことに
なるんじゃなかったっけ?
イテレーターを取得する関数はbeginとendにしろって言われたんですけど そんなこと無いですよね?
>>978 そうじゃなきゃいけないってことはないけど、
そんな感じの名前にする方が一般的
それに、一口にイテレータといってもだな…w
>>978 そうしておけば、C++0x になったときに
range-based for が黙ってても使えるようになる。
begin(c)とend(c)がオーバーロードされてればメンバのほうは何でもいいんじゃないの?
range-based for ってかなり酷いものみたいだな。
>>980 rangeを取得する一般的な関数名も欲しいな。
begin,endがあればrangeが取れるんだけど、rangeをイテレータに分解した後またrangeに組みな押されるのが無駄に感じるんだなあ
>>982 rbegin
rend
lower_bound
upper_bound
find
find_if
STLでもすでにバリエーションいくつもあるしbegin/endにこだわること無いと思うよ
>>987 君がイテレータ取得メンバはbeginとend以外覚えたくない
つまりそれだけで十分だと考えてるようだからから
それは幻想だよって教えてあげたんじゃないか
>>986 それらは全て機能が異なる。バリエーションではない。
たとえば、beginと同じ機能の、startとかfirstとかあったらバリエーションだろう。迷惑なは無しだけどな
begin&endはプロジェクトの名前規約に違反することが多すぎて困る
未だにあるんだろうね、「メソッド名は大文字で始めねばならない」とか規約作ってるところ…w
動詞で始まるとかな まあでもこれはセンス無い命名だと思う 誰が見ても最初は何かを始めて、何かを終わらせる関数 つまりイニシャライザとファイナライザに見えて不安になる
最近gcc4.6にrange-based forが実装されたらしい。
>>993 いや、でも、begin()はイニシャライザといってもいいし。
ま、end()はちょっとあれかなw
head tail にしてほしかった
>>996 ああ、確かにそっちの方がセンスいいかもしれねーな…
ただ、head()、tail()とかリンクドリストとかでよく使ってるからな…
>>996 tailだと最後の要素を指すのか?非合理だね
次ぎすれどうすんだ
tailでセンスいいとかw 盲信しろとは言わんがもう少し先人の苦労に敬意を払えよ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。