C++相談室 part56

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/09/24(月) 21:56:41
カルシウムが足りない奴がいるな
953C ◆jGKdrJZSEs :2007/09/24(月) 21:57:29
finallyでdeleteすればいいじゃない
954デフォルトの名無しさん:2007/09/24(月) 22:35:00
Visual C++やってるんですが…コンソールアプリケーションからやってるんですが…
なんかもぅよくわからなくなってきました。
955デフォルトの名無しさん:2007/09/24(月) 22:39:10
>>954
boost::mplを使ってみろ。話はそれからだ。
956デフォルトの名無しさん:2007/09/24(月) 22:46:49
話はそれからってw
そこまで行くのがまず大変だな。
957デフォルトの名無しさん:2007/09/24(月) 22:56:34
すみません。
そこまでいってすらいないど素人です。
958デフォルトの名無しさん:2007/09/24(月) 22:57:32
で、ここは相談室なんだが、何を訊きたいの?
959デフォルトの名無しさん:2007/09/24(月) 23:00:32
皆さんがまだ、C++を始めたばかりのころに参考にした書籍を教えて下さい。
960デフォルトの名無しさん:2007/09/24(月) 23:05:02
書籍スレがあるからそっちで。
961デフォルトの名無しさん:2007/09/24(月) 23:07:07
962デフォルトの名無しさん:2007/09/24(月) 23:07:23
>>960
わかりました。
963デフォルトの名無しさん:2007/09/24(月) 23:14:49
boost使ってなけりゃど素人か、そうかおれもそうだもんな・・・精進しよう
964デフォルトの名無しさん:2007/09/24(月) 23:17:54
boost使いは一杯いるけど、boost.mpl使ってる奴となると相当少ないと思うがな
965デフォルトの名無しさん:2007/09/24(月) 23:27:25
一応C++ Template Metaprogrammingは読んだけど、
MPLをまともに使おうとは思わない俺はヘタレ。
いやまあ、確かに面白いけどねぇ。
966デフォルトの名無しさん:2007/09/25(火) 01:03:58
次スレは 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++の仕様ですか?
968デフォルトの名無しさん:2007/09/25(火) 01:38:51
>>967 はい。 typedef typename listT::iterator listTit; でどうぞ。
969デフォルトの名無しさん:2007/09/25(火) 01:41:53
>>968
なんだかよくわからんけどコンパイル通りました
ありがとうございます
970デフォルトの名無しさん:2007/09/25(火) 01:50:26
>>968
このdependent nameの問題、会社でもよく聞かれるんだけど、詳しく解説してる日本語のサイトご存知ないですか?
"typename"だけじゃなくて、できれば"template"が必要な件にも触れてあると嬉しいです。
971デフォルトの名無しさん:2007/09/25(火) 01:53:42
>>967,968
Hogeの定義の部分ではlistTが具体的にどのクラスかは確定していなくて
コンパイラにはiteratorというのが型なのか値なのかがわからないかららしい。
972デフォルトの名無しさん:2007/09/25(火) 08:27:48
テンプレートは型だけじゃなくて値でも特殊化できるからかな。
973デフォルトの名無しさん:2007/09/25(火) 16:50:53
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_;
...
};
974デフォルトの名無しさん:2007/09/25(火) 16:51:30
973の続き

設計1の問題点
・CharacterAのインスタンスが生成されるより前に、Character::owner_が初期化されることが保障されていない
・基底クラスのメンバは仮想関数だけにしたい(拘る必要なし?)

設計2の問題点
・CharacterAのインスタンス毎にポインタを保持するオーバーヘッドが気になる

一般的にどちらの設計にするべきですか?
975デフォルトの名無しさん:2007/09/25(火) 19:40:25
キャラクターが管理クラスにアクセスしない設計にする。
循環依存もダメだろ。
一回引き出しにしまって一週間後に見直してみよう。
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 ではコンパイル通ります。
977デフォルトの名無しさん:2007/09/25(火) 21:17:15
>>974
GameManagerをシングルトンにして、
static GemeManager *GameManager::GetInstnace()
{
static GameManager instance;
return &instance;
}
とかするのはどう?
GameManager派生クラスを作るなら、これじゃだめだけど。
978デフォルトの名無しさん:2007/09/25(火) 21:22:46
ポインタじゃなくて参照で返せよ
979デフォルトの名無しさん:2007/09/25(火) 21:27:08
・保守時に混乱をきたすのでポインタにすべき
・表記法が乱雑になるので参照にすべき

・両方考慮して両方共に実装すべき
980デフォルトの名無しさん:2007/09/25(火) 21:29:57
保守時に混乱?バカは氏ね
NULLが返ることなんかないし、オマエみたいなボケがdeleteしたり
しないためにも参照で返せアホ
981デフォルトの名無しさん:2007/09/25(火) 21:33:35
アホは参照だろうがポインタだろうが危険な事をするのでどっちでもいい
982デフォルトの名無しさん:2007/09/25(火) 21:34:52
じゃあ俺はshared_ptrで返すようにするのを提案してみる
983デフォルトの名無しさん:2007/09/25(火) 21:34:55
>・保守時に混乱をきたすのでポインタにすべき
>・表記法が乱雑になるので参照にすべき
どっちも何が言いたいのかワカラン
984デフォルトの名無しさん:2007/09/25(火) 22:42:23
>>974
一般的には個々の状況において、自分で責任を持って判断すべきでしょう。

とはいえ、俺なら何となく設計2を選びたくなるかな。
一番素直だし。
個々のCharacterがGameManagerにアクセスする必要性があるんでしょ?
(他のキャラクターを検索して行動を決めるとか、別の物体(弾とか?)を追加したり)
キャラクターが自分が所属する空間を認識したり影響を与えるのは自然のことのように思えるし。

メモリの無駄が気になるならstatic(やシングルトン等)にするか、毎回引数で引き渡すか。
前者はGameManagerのインスタンスが一つと決まっているならわりとよくある手。
後者は複数のGameManagerが同時に存在して、かつ、メモリの無駄を省く必要性があるなら、仕方ないところ。

というか、設計1と2だったら関数一つ挟めば、いつでも切り替えられるように出来るでしょう。
とりあえずシンプルな方を選んでおけば?
985デフォルトの名無しさん:2007/09/25(火) 23:01:55
C++やり始めて間もないのですが、クラスというものを理解したくて
いろいろクラスを設計してみているのですが、
なんか継承を使う機会がなかなかありません
継承かなと思ってもいやこれは継承じゃなくてメンバ変数に他のクラスが入ってるだけだなってなります
メンバ変数に他のクラスが入ってるようなときにがんばれば継承でも書けるような気がしないでもないのですが
そうするのって正しいのでしょうか?
986デフォルトの名無しさん:2007/09/25(火) 23:08:46
継承なんかつかわなくてもいいよ
987デフォルトの名無しさん:2007/09/25(火) 23:12:54
継承を知りたいならJavaのinterfaceのほうがいい
988デフォルトの名無しさん:2007/09/25(火) 23:24:56
>>985
たとえばどんなクラスを設計した?
989デフォルトの名無しさん:2007/09/25(火) 23:25:27
ある程度でかいプログラムじゃないと、あまり継承の有効性は出てこないよ。

継承の利点は、ベースクラスの再利用というのもあるけど、
ポリモーフィズムで既存のコードを修正せずにどんどん拡張できるというのが一番大きい。
だから、大規模なプログラムでサブクラスがたくさん必要になるようなケースじゃないと
継承の利点はあまり出てこない。
990デフォルトの名無しさん:2007/09/25(火) 23:50:42
趣味で動的型付け言語の作り始めたとき、
初めてちゃんと継承にお礼が言えた。
991デフォルトの名無しさん:2007/09/26(水) 00:05:07
>>973
どっちでもいいんじゃないかな言いたいことは伝わってくるよ
俺は無神論者なんでownerみたいなのを個体に置きたくなかったから
他の個体を調べたりownerへの参照が必要な操作はstatic関数としてまとめてしまった

>>974
生命体の群みたいのを扱うとどうしても循環参照ができちゃうんだよ
こいつらは目ん玉がついてて自分で自分たちのことを認識するんだからしようがない
992デフォルトの名無しさん:2007/09/26(水) 00:07:07
クラスを使った情報隠蔽が継承を使うとぶっ壊れるってことにすっっっごい気をつけてね。
ここをちゃんと理解できたって思うまで継承は絶対に使っちゃダメだよ。
993デフォルトの名無しさん:2007/09/26(水) 00:29:28
画像フィルタクラスみたいなものも継承使うと楽なんだけどね。
ベースクラスに何もしないフィルタを作っておいて、それを継承して暈しフィルタや色フィルタ、
更にそれらを継承してバリエーションを持たせるとか。
994973:2007/09/26(水) 01:17:37
>>977
なるほど、シングルトンはすっかり忘れていました。

>>984
参考になります。
最初に考えたGameManagerへのアクセスが、まさに弾などの追加でした。

>>991
static関数を使う方法もあるんですね。


シングルトンにするか、設計2の方法でいくか、もう少し考えてみます。
どうもありがとうございました。
995デフォルトの名無しさん:2007/09/26(水) 02:00:39
>>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パターンと言う奴になる。
996v(^・^)v:2007/09/26(水) 04:10:54
997デフォルトの名無しさん:2007/09/26(水) 07:12:25
998デフォルトの名無しさん:2007/09/26(水) 10:26:25
999デフォルトの名無しさん:2007/09/26(水) 10:29:18
1000デフォルトの名無しさん:2007/09/26(水) 10:35:39
Destiny's CHILDREN
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。