952 :
デフォルトの名無しさん:2007/09/24(月) 21:56:41
カルシウムが足りない奴がいるな
finallyでdeleteすればいいじゃない
Visual C++やってるんですが…コンソールアプリケーションからやってるんですが…
なんかもぅよくわからなくなってきました。
955 :
デフォルトの名無しさん:2007/09/24(月) 22:39:10
>>954 boost::mplを使ってみろ。話はそれからだ。
話はそれからってw
そこまで行くのがまず大変だな。
すみません。
そこまでいってすらいないど素人です。
で、ここは相談室なんだが、何を訊きたいの?
皆さんがまだ、C++を始めたばかりのころに参考にした書籍を教えて下さい。
960 :
デフォルトの名無しさん:2007/09/24(月) 23:05:02
書籍スレがあるからそっちで。
boost使ってなけりゃど素人か、そうかおれもそうだもんな・・・精進しよう
964 :
デフォルトの名無しさん:2007/09/24(月) 23:17:54
boost使いは一杯いるけど、boost.mpl使ってる奴となると相当少ないと思うがな
一応C++ Template Metaprogrammingは読んだけど、
MPLをまともに使おうとは思わない俺はヘタレ。
いやまあ、確かに面白いけどねぇ。
次スレは part58 でよろしく。
967 :
デフォルトの名無しさん:2007/09/25(火) 01:36:42
#include <list>
using namespace std;
template < typename T >
class Hoge
{
typedef list< T > listT;
typedef listT::iterator listTit;
};
これをVC2003でコンパイルしても
構文エラー : ';' が、識別子 'listTit;' の前に必要です。
ってエラーになるんですがC++の仕様ですか?
>>967 はい。 typedef typename listT::iterator listTit; でどうぞ。
>>968 なんだかよくわからんけどコンパイル通りました
ありがとうございます
>>968 このdependent nameの問題、会社でもよく聞かれるんだけど、詳しく解説してる日本語のサイトご存知ないですか?
"typename"だけじゃなくて、できれば"template"が必要な件にも触れてあると嬉しいです。
>>967,968
Hogeの定義の部分ではlistTが具体的にどのクラスかは確定していなくて
コンパイラにはiteratorというのが型なのか値なのかがわからないかららしい。
テンプレートは型だけじゃなくて値でも特殊化できるからかな。
STGやRTSのように画面上にキャラクターがたくさん出てくるゲームで、
キャラクタークラスからゲーム管理クラスにアクセスする必要がある場合、
ゲーム管理クラスへのポインタをstaticで持つべきか悩んでいます。
// 設計1
class CharacterOwner {...};
class Character {
protected:
static CharacterOwner* owner_;
...
};
class GameManager : CharacterOwner {
public:
...
private:
std::vector<Character*> characters_;
};
class CharactorA : Charactor {...};
// 設計2
class CharacterOwner {...};
class Character {...};
class GameManager;// 設計1と同じ
class CharacterA : Character {
private:
CharacterOwner* owner_;
...
};
973の続き
設計1の問題点
・CharacterAのインスタンスが生成されるより前に、Character::owner_が初期化されることが保障されていない
・基底クラスのメンバは仮想関数だけにしたい(拘る必要なし?)
設計2の問題点
・CharacterAのインスタンス毎にポインタを保持するオーバーヘッドが気になる
一般的にどちらの設計にするべきですか?
キャラクターが管理クラスにアクセスしない設計にする。
循環依存もダメだろ。
一回引き出しにしまって一週間後に見直してみよう。
976 :
デフォルトの名無しさん:2007/09/25(火) 20:53:02
class A
{
public:
virtual A* f(){ return new A; }
};
class B : public virtual A
{
public:
virtual B* f(){ return new B; }
};
class C : public virtual A
{
public:
virtual C* f(){ return new C; }
};
class D : public B, public C
{
public:
virtual D* f(){ return new D; }
};
多重継承(仮想継承)すると vc8 だと「あいまいな継承」とコンパイルエラーになるんですが
C++仕様的にはどうなんですか?因みに cygwin の gcc ではコンパイル通ります。
>>974 GameManagerをシングルトンにして、
static GemeManager *GameManager::GetInstnace()
{
static GameManager instance;
return &instance;
}
とかするのはどう?
GameManager派生クラスを作るなら、これじゃだめだけど。
ポインタじゃなくて参照で返せよ
・保守時に混乱をきたすのでポインタにすべき
・表記法が乱雑になるので参照にすべき
・両方考慮して両方共に実装すべき
保守時に混乱?バカは氏ね
NULLが返ることなんかないし、オマエみたいなボケがdeleteしたり
しないためにも参照で返せアホ
アホは参照だろうがポインタだろうが危険な事をするのでどっちでもいい
じゃあ俺はshared_ptrで返すようにするのを提案してみる
>・保守時に混乱をきたすのでポインタにすべき
>・表記法が乱雑になるので参照にすべき
どっちも何が言いたいのかワカラン
>>974 一般的には個々の状況において、自分で責任を持って判断すべきでしょう。
とはいえ、俺なら何となく設計2を選びたくなるかな。
一番素直だし。
個々のCharacterがGameManagerにアクセスする必要性があるんでしょ?
(他のキャラクターを検索して行動を決めるとか、別の物体(弾とか?)を追加したり)
キャラクターが自分が所属する空間を認識したり影響を与えるのは自然のことのように思えるし。
メモリの無駄が気になるならstatic(やシングルトン等)にするか、毎回引数で引き渡すか。
前者はGameManagerのインスタンスが一つと決まっているならわりとよくある手。
後者は複数のGameManagerが同時に存在して、かつ、メモリの無駄を省く必要性があるなら、仕方ないところ。
というか、設計1と2だったら関数一つ挟めば、いつでも切り替えられるように出来るでしょう。
とりあえずシンプルな方を選んでおけば?
C++やり始めて間もないのですが、クラスというものを理解したくて
いろいろクラスを設計してみているのですが、
なんか継承を使う機会がなかなかありません
継承かなと思ってもいやこれは継承じゃなくてメンバ変数に他のクラスが入ってるだけだなってなります
メンバ変数に他のクラスが入ってるようなときにがんばれば継承でも書けるような気がしないでもないのですが
そうするのって正しいのでしょうか?
継承なんかつかわなくてもいいよ
継承を知りたいならJavaのinterfaceのほうがいい
ある程度でかいプログラムじゃないと、あまり継承の有効性は出てこないよ。
継承の利点は、ベースクラスの再利用というのもあるけど、
ポリモーフィズムで既存のコードを修正せずにどんどん拡張できるというのが一番大きい。
だから、大規模なプログラムでサブクラスがたくさん必要になるようなケースじゃないと
継承の利点はあまり出てこない。
趣味で動的型付け言語の作り始めたとき、
初めてちゃんと継承にお礼が言えた。
>>973 どっちでもいいんじゃないかな言いたいことは伝わってくるよ
俺は無神論者なんでownerみたいなのを個体に置きたくなかったから
他の個体を調べたりownerへの参照が必要な操作はstatic関数としてまとめてしまった
>>974 生命体の群みたいのを扱うとどうしても循環参照ができちゃうんだよ
こいつらは目ん玉がついてて自分で自分たちのことを認識するんだからしようがない
クラスを使った情報隠蔽が継承を使うとぶっ壊れるってことにすっっっごい気をつけてね。
ここをちゃんと理解できたって思うまで継承は絶対に使っちゃダメだよ。
画像フィルタクラスみたいなものも継承使うと楽なんだけどね。
ベースクラスに何もしないフィルタを作っておいて、それを継承して暈しフィルタや色フィルタ、
更にそれらを継承してバリエーションを持たせるとか。
994 :
973:2007/09/26(水) 01:17:37
>>977 なるほど、シングルトンはすっかり忘れていました。
>>984 参考になります。
最初に考えたGameManagerへのアクセスが、まさに弾などの追加でした。
>>991 static関数を使う方法もあるんですね。
シングルトンにするか、設計2の方法でいくか、もう少し考えてみます。
どうもありがとうございました。
>>985 一例としては、クラスAが別のクラスBを使う時、クラスBが行う処理を実行時に
変更できるようにしたい場合に継承が必要になる。
つまり、
class A {
void foo(B &b) { b.bar(); }
};
class B {
virtual void bar();
};
class B1 : public B { /* ... */ };
// ...
int main() {
A a;
B1 b1;
B2 b2;
// Aを変更しなくてもBを継承したクラスを新しく作る事で
// A::fooの動作を変更できる
a.foo(b1);
a.foo(b2);
}
AとBが同じクラスならTemplateMethodパターンと言う奴になる。
う
め
999 :
デフォルトの名無しさん:2007/09/26(水) 10:29:18
ぼ
Destiny's CHILDREN
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。