名前空間
953 :
デフォルトの名無しさん :2007/07/18(水) 21:36:01
演算子オーバーロード難しくてわかんないですっ!
俺は後置 _ をつけておく。 #ifndef XXX_H_ #define XXX_H_ #endif // #ifndef XXX_H_
>>953 例えば a + b は a.operator+(b) や operator+(a, b) という関数呼び出しに変換される。
どちらかが定義されていれば、その定義通りに実行される。
ただそれだけのことだ。
956 :
デフォルトの名無しさん :2007/07/21(土) 08:29:19
前者がメンバ関数で後者がフレンド関数ですねっ! うおおおお、なんだかわかってきたぞー! でもわかったのと使いこなせるのは別の話だけど。 とりあえず演算子のオーバーロードの章は終わって これから継承ですっ!
必ずフレンドにしなきゃいけないわけでもないが、まあどうでもいい話か。
CRTPを使った継承と、 普通のコンポジションとの使い分けを教えてください。
>>958 CRTP なんて奇怪なコード、本当に必要だと説明できる場面でしか使うな。
CRTP は mix-in の代わりとして使う。
961 :
デフォルトの名無しさん :2007/07/23(月) 09:33:40
仮想関数難しすぎますっ
アップキャストしても本来の型の関数が呼ばれるってだけの話。
963 :
デフォルトの名無しさん :2007/07/23(月) 11:14:10
基本クラスのポインタで派生クラスを指すことができるのは 覚えるしかないんでしょうけど、 基本クラスのポインタで派生クラスのメンバにアクセスできないのに 仮想関数では派生クラスで再定義されたものが使われるっていうのが 納得できません。 これはもうそういうものだと覚えるしかないんでしょうか。
「納得できない」って言葉は仕様や実装を理解した上で、その欠点をはっきり示す事ができ、よりよいモノを自分で提案できる場合にこそ使われるべきだと思うよ。 仕様や実装は理解できてるのかな?
>>963 納得できないとか、覚えるしかないとか何を言いたいのかよくわからんが、
どのポインタとして扱われても本来の関数が起動される仕組みとして仮想関数が用意されているだけの話。
嫌なら仮想関数を使わなければいいだけじゃん。
基底クラスが仮想関数を起動するってのは、あくまで自分のメンバである仮想関数を起動した結果、継承クラスの仮想関数が起動されるのであって、 直接継承したクラスの関数を起動するわけではない。
>>963 そこが仮想関数の「便利」なところなんだぜ。
複数のクラス D, E, F, ... の共通部分を基底クラス B として提供しておけば、
その基底クラス B への参照やポインタを使って処理 X を 1 個だけ記述しておけば、
それから派生している全てのクラス D, E, F, ... に対してその処理 X を適用できる。
派生クラスごとに処理が変わる部分は、全て仮想関数で提供しておけばいい。
X が派生クラスのメンバに直接アクセスできないのはむしろ利点で、
X が派生クラスに依存しない形で書けているからこそ、
B の派生クラスであれば何であっても X で処理することができるのだ。
実際のところ動的多態性が要求される場面ってそんなに多いか?
ありまくり
970 :
デフォルトの名無しさん :2007/07/23(月) 21:33:41
JISの規格を読みました。 派生クラスで再定義された仮想関数は 基底クラスの仮想関数を上書きするんですね。 本の説明の解釈の仕方・理解の仕方もちょっとまずかったみたいで 頭の中がぐちゃぐちゃになってたみたいです。 まだすっきりしないかんじはあるけど なんとなくわかってきました。 ありがとうございました。
971 :
デフォルトの名無しさん :2007/07/23(月) 22:28:56
C++からJAVAのオブジェクト(API)を利用する事ができますか?
VM的なモノをつくればいけます
>>971 gcj限定でよければJNIよりCNIの方がエレガント
975 :
デフォルトの名無しさん :2007/07/23(月) 23:22:57
C++からJAVA?
僕をあなたのクラスのfriendにしてください><
977 :
デフォルトの名無しさん :2007/07/24(火) 23:20:01
クラステンプレート難しすぎますっ!
template class Tenpureito<T> { T v_; const T get() const { return v_; } void set(const T& v) { v_ = v; } void print() { cout << v_; } };
>>978 このレベルがサクッと空で書けるようになるには普段からtamplateを
多用していないと無理?
書かれたコードを見れば終えるんだけど、いざコーディングするとなると
経験不足から時間がかかってしまうんだが・・・
>>979 最初は適当な型で普通にクラスを書いて、
それからテンプレートに置き換える。
というようにやってみては?
>>980 ああ、確かに。適当な型で動作したのならテンプレートにしても
とりあえずその型で使っている限りは同じ動作になるはずなんだもんな。
>>979 プログラムをサクッ空で書く必要なんて無いだろ。コンパイルエラーが
出てから直せばいいんだよ。そうしてるうちに慣れる。
さんざんこの過程を経てるはずなのに慣れないってんなら、テンプレート
関係無しにプログラムに向いてないだけだと思われ。
>>979 デフォルトのアクセス制御とか、const とか、C++ そのものに慣れて
いないみたいだから、もっと手を動かして体で覚えたほうがいいと思う。
テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。
test
>>テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。 そんなこと言うと変なのが湧くぞ
あれだよ あひるタイピングって奴さ
それがアヒルならアヒルだ この言葉知るまでは「テンプレートによるインターフェース」とか言ってたな
ダックタイピングって言葉、C++の方で普及してるの? python使ってるときは、ダックタイピング、 C++の時は静的インターフェイスとか、テンプレートによるインターフェイスとか言ってる。
templateってコンテナ作る以外に何が便利なの?
イテレータとアルゴリズム作るのに便利。
Boost を見ればその便利さが分かる。そして気持ち悪さも。
テンプレート引数に型以外の物も使えるというのが重要で、 これによって、コンパイル時プログラミングというジャンルが発展した。 Boostはその成果。 とはいえ、実際のプログラミングの場面では、そこまでのものが必要に なることはあまり無くて、実用上は、 >テンプレートってのは、要するにどんな型でも使えるよってだけ という認識でも別にいいかなとも思う。
たらいを回してみるのもまた一興
暑い
エルニーニョ→ショタ ラニーニャ→ロリ
ぬるぽ
ぬるぽ
ぬるぽ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。