トップページgamedev
935コメント361KB

OOとゲームプログラミング

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。01/11/07 23:55ID:HnYWCQK1
OOをどのように用いれば美しくゲームプログラミングを
行うことが出来るのか語り合うスレです。
0819名前は開発中のものです。02/08/15 19:30ID:???
>>818
マジメに書くと長くなるんだが…。昔のコードから抜粋すると、こんな感じ。

// 永続オブジェクト基底クラス
class CPObject {
private:
  static const BYTE bytMagic[3];
  static const UINT MAGICLEN;

public:
  virtual ~CPObject() {}
  virtual BOOL equalsTo(const CPObject* obj) const {
    return this == obj;
  }
  virtual BOOL saveIt (FILE*) const = 0;
  virtual BOOL restoreIt(FILE*) = 0;
  void save(FILE*) const;
  static CPObject* restore(FILE*);

  virtual UINT isA() const = 0;
};
0820名前は開発中のものです。02/08/15 19:31ID:???
// 永続オブジェクト ID 辞書クラス
class CPIDDict {
private:
  struct CPIDRec {
    UINT id;
    CPObject* (*func)();
  };
  CPIDRec* array;
  UINT size;
  UINT cap;
  CPIDDict(const CPIDDict&);
  CPIDDict& operator=(const CPIDDict&);

public:
  CPIDDict();
  ~CPIDDict();
  static CPIDDict* theCreator();
  void regist(UINT, CPObject* (*)());
  CPObject* create(UINT) const;
};
0821名前は開発中のものです。02/08/15 19:32ID:???
// ファクトリを ID 辞書に登録する
// クラス実装ファイル (*.cpp) の先頭に記述
#define REGISTER_CPOBJECT(X, ID) \
static CPObject* X ## creator() { return new X; } \
class X ## Creator { public: X ## Creator(); }; \
X ## Creator::X ## Creator() {\
    CPIDDict::theCreator()->regist(ID, X ## creator);\
};\
static X ## Creator X ## dummy __UNUSED__;

// 永続オブジェクト関連メソッドの宣言
// クラスへッダファイル (*.h) の public セクションに記述
#define DECLARE_CPOBJECT(ID) \
virtual BOOL saveIt(FILE*) const;\
virtual BOOL restoreIt(FILE*);\
virtual UINT isA() const {\
    return ID;\
}

#define RESTORE_CPOBJECT(TYPE, FP) \
    (dynamic_cast<TYPE>(CPObject::restore(FP)))
0822名前は開発中のものです。02/08/15 22:55ID:LqMXg9lL
class Class { public: virtual ~Class(){} };
typedef int ID;
class IGenerator;
class ClassFactory : private map<ID,IGenerator*>
{
typedef map<ID,IGenerator*> Base;
public:
bool can_create( const ID& id ) const { return ( Base::find( id ) != Base::end() ); }
void insert( const ID& id , IGenerator* const p ) { Base::insert( make_pair( id , p ) ); }

template<class CLASS>
auto_ptr<CLASS> create( const ID& id ) const
{
Base::const_iterator const found = Base::find( id );
return auto_ptr<CLASS>( ( found != Base::end() && found->second )
? dynamic_cast<CLASS*>( found->second->Generate().release() )
: 0 );
}
};
ClassFactory& getClassFactory() { static ClassFactory instance; return instance; }
struct IGenerator
{
IGenerator( ID id ) { getClassFactory().insert( id , this ); }
virtual ~IGenerator(){}
virtual auto_ptr<Class> Generate() = 0;
};
0823名前は開発中のものです。02/08/15 22:55ID:LqMXg9lL
class MyClass : public Class
{
public:
static const ID key;
MyClass(){}
private:
struct Generator : IGenerator
{
Generator() : IGenerator( MyClass::key ) {}
auto_ptr<Class> Generate() { return auto_ptr<Class>( new MyClass ); }
};
static Generator generator;
};
const ID MyClass::key = 12345;
MyClass::Generator MyClass::generator;
0824名前は開発中のものです。02/08/15 22:57ID:???
int main()
{
cout << "create MyClass by correct key... ";
auto_ptr<MyClass> p1 = getClassFactory().create<MyClass>( MyClass::key );
cout << ( p1.get() ? "ok" : "ng" ) << endl;

cout << "create MyClass by wrong key... ";
auto_ptr<MyClass> p2 = getClassFactory().create<MyClass>( 100 );
cout << ( p2.get() ? "ok" : "ng" ) << endl;

return 0;
}
0825修正02/08/15 23:05ID:???
template<class CLASS>
auto_ptr<CLASS> ClassFactory::create( const ID& id ) const
{
Base::const_iterator const found = Base::find( id );
if( found != Base::end() )
{
IGenerator* const p = found->second;
if( p )
{
auto_ptr<Class> pbase = p->Generate();
CLASS* const ptest = dynamic_cast<CLASS*>( pbase.get() );
if( ptest )
{
pbase.release();
return auto_ptr<CLASS>( ptest );
}
}
}
return auto_ptr<CLASS>();
}
0826あぼーんNGNG
あぼーん
0827名前は開発中のものです。02/08/16 00:57ID:???
シリアライズ=排他処理
0828名前は開発中のものです。02/08/17 20:32ID:???
尻穴is=排泄処理
082981302/08/18 17:49ID:???
おお、解説&ソースうpありがとうございます。
(って、まだ全部ちゃんと読んでないですが)

ちょっくらやってみるか。ってシリアライズなしでやってたものに
シリアライズつけるの厳しそうだな……(いちおうスーパークラスはあるんだけど)
0830名前は開発中のものです。02/10/06 17:36ID:4VoU6WQ6
>>828

ワラタ
0831名無しさん02/10/06 17:40ID:???
あ3w45えrgtyくぉえぴVん:http://genie.gaiax.com/home/nakatai
HGBTR4MHGBP0T5え@ご9JR4QPV「Jる5VG
DB5VHG4ヴぇR4TPヴぇR5MHGBTじhttp://genie.gaiax.com/home/nakatai
http://genie.gaiax.com/home/nakatai
さDRGヴぁでRGBはえ;んごいえろげいR
あえRSHGべSDRHDSVGDRFせVDRFせVせDFGVRFせDヴぇDRFSげDFS
http://genie.gaiax.com/home/nakatai

0832あぼーんNGNG
あぼーん
0833名前は開発中のものです。02/10/28 04:08ID:???
ほしゅ
0834名前は開発中のものです。02/11/03 01:14ID:???
OOってそれぞれの人で考えてる程度が違うから、
チーム開発に適用するのは難しいよね。
0835あぼーんNGNG
あぼーん
0836名前は開発中のものです。02/11/03 01:35ID:???
>>834
> OOってそれぞれの人で考えてる程度が違うから、
プログラミング自体それぞれの人で考えてる程度が違う
0837名前は開発中のものです。02/11/03 10:51ID:ZJseP0w7
なんつーか、あれだよ。
まずはヘッダファイルの一括インクルードする奴は駄目な奴だと
いうことを同僚にたたき込む方法を教えてくれ。
0838名前は開発中のものです。02/11/03 10:59ID:???
>>837
どいうレバルで?VCとかだとコンパイル時間早くするためにやったりするし。
ライブラリレイヤーなんか#include "KaisyaLib.h"で済ませちゃうのが普通じゃない?

アプリケーションレイヤーでそれやられると結構泣けるな。
0839あぼーんNGNG
あぼーん
0840名前は開発中のものです。02/11/03 11:48ID:???
てことはstdafx.hもアウトか?
0841名前は開発中のものです。02/11/03 16:12ID:???
>>837
そいつは、ずっと一人(多くてせいぜい2人)で開発をしてきたか
もしくはソースコードの管理はその一人で(しかも人力で)やってきたか
多人数で効率よく開発する仕組みを全く知らなくても良い立場なんだろ。
 
 
他のモジュールとの依存関係を把握してない。orしたくない。orする必要ない。
  ↓
とりあえず全部インクルードしちゃえ。単体テスト不能?知るかボケ。
  ↓
いきなり結合テスト。make時にリンクされるモジュールが具体的に
どれなのか勿論分かってない。まぁ他のモジュールは全て安定版と
確信してるから何も問題ないね。根拠?知るかボケ。
  ↓
不具合を確認。デバッグ作業開始。3日経過。あ、ボスが来た。
「ボス:どうかね、進捗のほうは」「漏れ:はい順調です(苦笑)」
084284102/11/03 16:20ID:???
複数メンバーとの並行作業が事実上不可能。
 
実際にやったら
あちこちに(作業上の)クリティカルセクションがありそうだ。
ある一人のデバッグ作業が終了するまで他の全ての人間の作業が
停止することが日常茶飯事みたいな。
 
的外れだったらスマン。
0843名前は開発中のものです。02/11/03 16:30ID:???
>まずはヘッダファイルの一括インクルードする奴は駄目な奴だと
これがよくわからんが、プロジェクト中の自分が使わないヘッダファイルまでインクルードするってことか?
0844名前は開発中のものです。02/11/03 17:06ID:???
開発当初から最後まで一貫して手を入れずに使い続けるようなものは
ある程度の単位にパッケージ化して(安定した)基本セットとして渡す
ことはよくあるな。
 
もっともそれは#include <xxxx.h>がずらーりと並ぶようなヘッダファイルを
用意するということではなく、リリース用の.oファイルと.hファイルのセットを
用意(というか自動生成)するという意味だが。
0845名前は開発中のものです。02/11/03 17:06ID:???
VCなら.libと.hか。
0846名前は開発中のものです。02/11/03 18:46ID:???
>>843
それやられると、一つのヘッダを書き換えただけで常にフルビルド状態に
なっちゃうんだよね。特に、前方宣言ですむところを #include するのは
犯罪だ。
0847名前は開発中のものです。02/11/03 19:14ID:???
VC++ならプリコンパイル済みヘッダがあるので
コンパイル時間については心配いらないんだけどね。

ヘボいコンパイラしかない環境って悲惨だね。
0848名前は開発中のものです。02/11/03 20:55ID:rqxcf8ww
837ですけど。
841さんと842さんのいう状況そのまんまで爆笑しました。
なんつーか説得は不可能ですよね。
なにいっているかわからない人はわからなくていいです。
そのほうが幸せだと思います。
0849名前は開発中のものです。02/11/03 20:56ID:???
>>847
意地の悪い質問で恐縮だが、ぜひ質問させてくれ。
 
00.cpp
01.cpp
02.cpp
03.cpp
(中略)
fe.cpp
ff.cpp
の先頭部分でそれぞれ
#include "00.hpp"
#include "01.hpp"
#include "02.hpp"
#include "03.hpp"
(中略)
#include "fe.hpp"
#include "ff.hpp"
という具合にインクルードしてたとして
00.hppを書き換えてmakeしても時間を気にする必要がないのか。
 
本当か?
085084902/11/03 21:08ID:???
いや、ゴメン。訂正。
 
#include "00.hpp"
#include "01.hpp"
#include "02.hpp"
#include "03.hpp"
(中略)
#include "fe.hpp"
#include "ff.hpp"
 
という内容のmarugoto.hppなるヘッダファイルを用意。
で、全ての.cppファイルの先頭で

#include "marugoto.hpp"

みたいな感じかな。スレの流れ的にいうと。
0851名前は開発中のものです。02/11/03 21:10ID:???
>>849-850
そのケースだと、最初の.cppをコンパイルするときに
プリコンパイル済みヘッダーが作られて(marugoto.hppを指定する)、
それ以降はそのヘッダを使いまわすことになります。
つまりmarugoto.hppとそのファイルが参照するヘッダファイルの読み込み&処理は
一度しか走らないんです。想像以上に速くなりますよ。

自分の経験ですが、30万行のC++コードのビルドが2分で済みます(P3-800)。
.cppが700ファイル、.hが800ファイルでした。
0852名前は開発中のものです。02/11/03 21:17ID:???
DelphiやJava信者から言わせると、CやC++のインクルードファイルっていう仕様が腐ってるだけなんだよね。
0853名前は開発中のものです。02/11/03 21:19ID:???
プリコンパイル済みヘッダを意識すると

> で、全ての.cppファイルの先頭で
>
> #include "marugoto.hpp"

というやりかたになります。
(VC++つかってる人なら知ってると思いますが、
雛形の.cppファイルの先頭でstdafx.hを#includeしてるのがそれです)

逆に、コレがない環境(たとえばgcc)だと、includeするヘッダを
最低限にする必要があるんですよね。これがまた非常にめんどくさい。

STLなんかを使うには事実上必須だと思うんですけど、ねえ・・・
0854849-85002/11/03 21:34ID:???
>>851-853
丁寧なレスどうもアリガd。
漏れWindowsで開発したことがないんだわー。
カルチャーショック受けたので今度のボーナスで
VisualStudio.NET買ってみるわ。
0855名前は開発中のものです。02/11/03 21:34ID:???
そうじゃなくて、自分のモジュールがどのモジュールに
依存するのかを明示しろってことだろ。
その辺があいまいだと、際限なく他モジュールに依存しまくった挙句、
最終的にはどれがどれに依存しているのか分からなくなってしまうからな。

その辺がクリアなら、インクルードファイルをまとめるのもアリだと思うがな。
あとはコンパイル効率の問題だけだし(チーム全体で合意ができればOK)。
合意を形成しようって努力をするプログラマが少ないってのはそのとおりかも。
俺も含めて。
0856名前は開発中のものです。02/11/03 21:37ID:???
Windowsに関しては、"windows.h"が重過ぎるってのがあるかも。
適当なマクロきれば軽くなるんだけど、あんまりしないよね。
0857名前は開発中のものです。02/11/03 21:40ID:???
依存関係の明確化は難しいね。
本来は設計の段階でクリアになってなきゃならないんだけど、
ユーティリティー的なモジュールはついついおざなりになってしまう。

モジュールの初期化の順序って問題になりやすくないですか?
0858名前は開発中のものです。02/11/03 21:41ID:???
>>856
ふつう真っ先にPCHに入れます。むしろそのためのPCH。
0859名前は開発中のものです。02/11/03 21:54ID:itYckWtp
つーか問題はコンパイル時間云々の問題じゃないんだけど。
雑魚はウザイから消えてくんない?
0860名前は開発中のものです。02/11/03 21:58ID:???
>>859
雑魚ってことで妥協するから
君の主張を書いてくれないか。
 
#喧嘩じゃないだろ。
0861名前は開発中のものです。02/11/03 23:29ID:???
>>101
少しでもって・・・それってそんなに大仰な話なのか?
モジュール化について深く解説した本とか見たことないけど。
0862名前は開発中のものです。02/11/03 23:55ID:???
>>854
PCH に頻繁に書き換えるヘッダ、特に開発中のゲーム本体のヘッダを
突っ込むのは止めたほうが。フルビルドのときには早くなるけど、PCH
を作るのに時間かかるからインクリメンタルビルドが遅くなる。

俺は PCH には標準ヘッダと boost、それに変更の頻度は低いがプリ
コンパイルしときたいライブラリ関係のヘッダだけ読ませてる。ライ
ブラリは別のプロジェクト (*.dsp) に分離ね。

>>859
> つーか問題はコンパイル時間云々の問題じゃないんだけど。
設計の問題が重要なのは言うまでもないが、規模が大きくなるとファイルの
物理的な依存関係も無視できない要因になる。CPU は速くなったが I/O は
大して速くなってないから。
0863名前は開発中のものです。02/11/03 23:55ID:???
>>858
いや、windows.h(とMFC関係?)が大きすぎることがコンパイル時間を遅くしている最大の原因だってこと。
Hello Worldをウィンドウに表示するプログラムを作ってもコンパイル行数10万行ってどうよ?ってことで。

>まずはヘッダファイルの一括インクルードする奴は駄目な奴だと
っていうこというなら、まず、windows.hとかから言うべきだよな。
(まぁ、OSってことで多少は意味合いが違うけど。)

で、pchってのは、そういう文化の上で必然的に生まれたものだって言うことをお忘れなく。

0864名前は開発中のものです。02/11/03 23:56ID:???
(というのは実はウソ。DOSのQuick C 1.0の時代から、インクリメンタルコンパイルは既に合ったしね。)
(Turbo Cもそういうのがウリだった。)
0865名前は開発中のものです。02/11/04 00:00ID:???
>>862
それなら、ディスクキャッシュに納まる程度なら問題ないという結論になりそうだ。
0866名前は開発中のものです。02/11/04 00:32ID:???
>>852
ハゲ同。
Delphiなら10万行くらいの再構築は10秒くらいで終わるし。

久々にVC++やgcc使って思うのはコンパイル遅いことだ
もうBorland製以外にはもどれん
0867名前は開発中のものです。02/11/04 00:32ID:???
>>865
充分なメモリを積んでもPCHにしたほうが速いよ。

ヘッダがいくら大量になろうと、PCHはほぼ一定の速度にしてしまうから
これの優秀さにコンパイラベンダは気づくべき。
0868名前は開発中のものです。02/11/04 00:37ID:???
>>867
プリコンパイル済みヘッダは、CodeWarriorにはたしかあるはず。
gccも3以降に動きがあると聞いたが...違うかも
0869名前は開発中のものです。02/11/04 01:48ID:???
なんでMSやBorlandが10年近くも前に実現してたpchが、
GCCにはないんだぁー!!

by PS2 プログラマー(GCCユーザー)
0870名前は開発中のものです。02/11/04 04:02ID:???
PS2のヘッダファイルもそんなに膨大な量あるの?
というか、G++のコンパイルの遅さ自体が問題なのかな。
0871名前は開発中のものです。02/11/04 04:10ID:???
>>861
ソフトウェア工学の薄くて高い本を読むと
構造化技法、モジュール強度やモジュール結合度について
6 ページくらいは書いてあるよ。
0872名前は開発中のものです。02/11/04 13:00ID:???
>>861
CODE COMPLETE と Writing Solid Code をセットでどうぞ。

>>870
PS2 標準のヘッダはまったく問題ない程度の量。ただ C++ で template を
多用し出すと、ちと気になるかな。(いろんな意味で)
0873名前は開発中のものです。02/11/04 23:35ID:Fll59Laa
>>872
 プロジェクト規模しだいでは「ちょっと」の領域は超えちゃうなぁ。
あと、一本上げて解ったんだけど、テンプレートはあんまりメモリに
優しくないので、中規模以上のプロジェクトではあんまり多用しない方が
いいような気がした。皆のトコではどーなんだろ?

どうでもいいけど、あんまりOOと関係ない流れだね。
0874名前は開発中のものです。02/11/04 23:50ID:???
この板だと「終了とゲームプログラミング」って感じだよな〜
0875名前は開発中のものです。02/11/04 23:53ID:???
>>874 どうぞこちらへ
http://game.2ch.net/test/read.cgi/gamedev/1011082291/
0876あぼーんNGNG
あぼーん
0877逝って良しの1 ◆.CzKQna1OU 02/11/05 00:00ID:jHnnn7PQ
test
0878逝って良しの1 ◆MvRbZL6NeQ 02/11/05 00:02ID:jHnnn7PQ
結論:
1)再利用可能モジュール以外は手続き型で書く
2)なるべく共通の部品て作れるように設計する。

純OOは効率落とすだけ
0879名前は開発中のものです。02/11/05 00:15ID:???
ム板にお帰りください。
0880名前は開発中のものです。02/11/05 00:38ID:2UkT6p85
とりあえずOOを理解しているやつがすくないってのはわかるね。
まあ結構苦労すると思うよ。なめてかかると。
概念に関しての勉強ってサボルやつが多いからなー。
生まれてから一度も考えたことありませんでした。ってやついるだろ?
だからわかるやつとわからないやつとで差がでかいんだろうね。
0881あぼーんNGNG
あぼーん
0882名前は開発中のものです。03/01/29 00:07ID:pDS/kJyx
なんとなくage
0883名前は開発中のものです。03/01/29 02:06ID:aSd9akLd
PCH は GCC では3.4からなり。
0884名前は開発中のものです。03/01/29 02:19ID:NJepGLCB
 なー、職業ゲームPGの諸君。おまいらの会社ではテンプレートは活発に
使ってますか?仕事にマイテンプレート集を導入したいのだが、周りは
テンプレートと聞いただけで拒絶反応。「テンプレートは何をやってるか
解からんからイヤ」っておまいら…。
0885名前は開発中のものです。03/01/29 03:43ID:L0pVR/JC
>>884
ピンきりだろうに。STL解析しろて訳じゃないんでしょ?

慣れないとちと読みづらいからね。
後、メモリ使用量が。速度的には良いんだが。
0886名前は開発中のものです。03/01/29 05:08ID:i6h+T8DP
Loki を使いたいと言われたら、それはいかがなものかと思う
0887あぼーんNGNG
あぼーん
0888名前は開発中のものです。03/01/29 07:45ID:Psv7UOXb
STLのないC++なんて、もぅ耐えられないかも。
0889名前は開発中のものです。03/01/30 01:08ID:Cu+ZSbHF
 お、皆さんとこもテンプレートモリモリ系ですか?やっぱ強引に社員教育
して導入するべきですかね。メモリ使用量はアロケータを工夫する事でなん
とかなるんだけど、コード増加量を理由に拒絶されるとどーにもこーにも。

 STLのメモリパフォーマンスについての資料ってどっかにないもんかなぁ。
0890名前は開発中のものです。03/01/30 02:17ID:L8+k5MAr
結果的に同じコードになっても、型が違うっちゅうことで
それぞれ別ルーチンになっちゃうのが痛いね。

VC6はそこそこ最適化してたな。
どういう仕組みかしらんが、中身がまったく同じルーチンは一つに
まとめてくれてたようだ。
0891名前は開発中のものです。03/01/30 11:52ID:/VkjZaaB
コード量のほうはマップファイル見てたらわかったりしない?
ピンチになったら、いらなさそうな(ポインタ絡みが多いな)奴を探して
特殊化で切っていくとかできる。

あぁ、でも、最適化できってくれるのが理想だよな。
同じテンプレートから生成されたコードを
バイナリコンペアで判定して、まったく同じのを消せばいい、と思うんだけど。
0892名前は開発中のものです。03/02/01 13:20ID:qAhwu2Kc
そーなんよねー。テンプレートのコードサイズ最適化に関する情報がどこにも
ないからね。プロジェクト末期にコードサイズが5M超えましたとかじゃ怖くて
使えないよな。

まぁマイクロソフトはともかく、GCCやCWに最適化の過度の期待は禁物だしな。
0893名前は開発中のものです。03/02/01 13:32ID:2fuADtqt
インライン化の程度によっては増えたり減ったりするのがなんとも・・・

昔、ポインタのコンテナクラスは、void* のコンテナクラスを作って
それをラッピングしてたじゃないですか。
そういう手間が省けないかなあ、とか。
0894名前は開発中のものです。03/02/01 20:32ID:D+RPtyeL
ふむ・・・
STLでvoid *のコンテナだけ使うことにして、
それにtemplateで任意の型にキャストして使うとか、どうかなー。
やったことないけど。

template< class T >
class WrappedList
{
protected:
vector< void * > m_vec;
public:
void push_back( T *pItem ) { m_vec.push_back( (void * ) pItem ); }
・・・
};
とか。
イテレータとか使えなくなるのはイタイか。
0895名前は開発中のものです。03/02/01 22:48ID:3xQxr2iu
>>894
template< typename T > class std::vecotr< T* > がほしーなー。
STLportで定義しといてくれたりすると泣いて喜ぶんだが。
そんな話ねーのかなー?
0896名前は開発中のものです。03/02/01 23:33ID:r8hHPPWq
こんな情報はいかが?

http://adult.misty.ne.jp/rank/enter.cgi?id=fdeai
0897名前は開発中のものです。03/02/02 13:11ID:TNSSpbv4
 いや、実際テンプレートで消費するメモリリソースなんかたかが知れて
るんだけどなー。sizeofみたいにコードサイズを取得する演算子がほしいな。
sizeofcode( template<T> );
って感じの。演算子じゃなくてもコンパイラの機能でいいんだけど。
0898名前は開発中のものです。03/02/02 14:23ID:9DYxK8lo
コード量の削減で思いついたんだけどさ、
リンク時に中身が同じなら一緒にするってことできないかな?
サイズとCRCをフラグメント(関数?)ごとに記録しておいて、
それらが一致したらシンボルをまとめちゃうの。

win32ならゲイツパワーでできそうだけど、
unix系では辛いかな・・・
0899名前は開発中のものです。03/02/02 22:50ID:G3FgB81u
質問ですが、
オブジェクトをCreate()で作成して、Release()で開放する
考え方? スタイル? をなんて言うんでしたっけ?
0900名前は開発中のものです。03/02/02 23:55ID:Uu0vPcKD
ところで
virtual inline関数って実体がコードに埋めこまれる?

int g; // グローバル変数
class X{
virtual inline void f(){ g = 1; }
};
class Y : public X{
virtual inline void f(){ g = 2; }
};

void main(){
Y yy;
yy.f();
}
これがインライン展開されて
void main(){
Y yy;
g = 2;
}
みたいになるのかなと?
0901名前は開発中のものです。03/02/03 00:25ID:rEcoP6s1
>>900
それならインスタンスの型が分かっているので展開可能。

main(){}でいいのに、なんでvoidなんて書くんだ?煽られるだけだぞ。
0902名前は開発中のものです。03/02/03 05:08ID:JqqWIodK
>>899
ファクトリーパターンか?
0903あぼーんNGNG
あぼーん
0904名前は開発中のものです。03/02/03 11:36ID:flCV13vo
>>901 可能は可能だけど、
実際にそれをやっているコンパイラがどの程度あるかは
微妙な気がするな。アセンブラコード出して確認するのがいいよ。
090589903/02/03 17:09ID:xLCE72Gt
>>902
ファクトリーパターンって言うんですか。
C++覚えたての時、自分で試行錯誤していてこのパターンを思いついたんですよ。
実際にこういうスタイルがあると知ったのは、最近の事です。
なんという名前だったのか思い出せなかったもので。
0906名前は開発中のものです。03/02/04 00:18ID:hx50gtdt
うそ教えちゃ遺憾
http://www.google.com/search?hl=ja&ie=Shift_JIS&q=%83t%83%40%83N%83g%83%8A%81%5B%83p%83%5E%81%5B%83%93
0907名前は開発中のものです。03/02/04 00:24ID:iI+staQY
あながち間違いでもないと思うが・・・
ファクトリの実装方法の一部、とでも言ったほうがいいのか?
0908名前は開発中のものです。03/02/04 00:28ID:f3Zc1toq
別に create() で作るとだけ言われても、
Factory パターンかもしれないし Prototype パターンかもしれないし他のパターンかもしれない
0909名前は開発中のものです。03/02/04 00:40ID:iI+staQY
他に何が考えられる?
091089903/02/04 01:03ID:27K59mYC
えーと、意味不明かもしれないんですが・・

(図1)
   A
   |
 |--|--|
 B C D

僕が考えたのは、上の(図1)見たいな構造になってます。
Aは B C Dを内部で、配列やリストなどで管理してます。
Aは B C Dのインスタンス作成メソッドを持ちます(CreateB(B*)みたいな感じ)。
Aのデストラクタで B C Dのインスタンスの開放or終了処理が行われます。

こんな感じです。
具体的なパターン名がありますか?
0911名前は開発中のものです。03/02/04 01:27ID:hx50gtdt
GOF本には載ってないのう
こっちで聞いてください
http://pc2.2ch.net/test/read.cgi/tech/994836140/
0912名前は開発中のものです。03/02/04 01:29ID:iI+staQY
B,C,Dが共通のインターフェースを持つ?
0913名前は開発中のものです。03/02/04 01:39ID:27K59mYC
>B,C,Dが共通のインターフェースを持つ?
ちょっと、よく分かりませんが、
すべてのインスタンスを A で管理しているので、
A->Release() ですべて delete 出来て良いかなと思って実装しました。
0914名前は開発中のものです。03/02/04 02:16ID:BGqxd6sP
 >>902 は ネ タ
0915名前は開発中のものです。03/02/04 02:25ID:xtMOPMMZ
 つーかファクトリメソッドパターンだな、それは。微妙に違う気もするが。
ファクトリメソッドパターン+コンポジットパターンって感じか。

class cHogeManager{
friend class cHoge;
public:
cHoge* Create(...);
};

class cHoge{
privet:
cHoge(...);
};

こーやってcHogeのcreate以外でcHoge生成出来なくなくしたりは良くするね。
0916名前は開発中のものです。03/02/04 09:02ID:iI+staQY
friendの場所が違うような・・・

あとこのやり方?はいわゆる「ハンドル」だと思ったが、
何かパターンとして命名されてるの?
0917名前は開発中のものです。03/02/04 11:24ID:BGqxd6sP
ファクトリメソッドパターン
コンポジットパターン
ハンドル
・・・どれも関係ないと思うんだが。
あー全部ネタか?
0918名前は開発中のものです。03/02/04 23:05ID:1eGNQOWM
コンポジションの関係にある、というだけ。
レス数が900を超えています。1000を超えると表示できなくなるよ。