2009-04-26 7 views
1

私は3つのクラスを含むC++ dllを開発しています:基本クラスBase,Derived1Derived2クラスです。 シナリオ:ユニークなベースクラスのインスタンス

class Base 
{ 
    //ctor, dtor, members and methods here 
} 

class Derived1 : public Base 
{ 
    //ctor, dtor, members and methods here 
} 

class Derived2 : public Base 
{ 
    //ctor, dtor, members and methods here 
} 

私はTurboC++の下で使用することを、私は、MS VC++ 2008のExpressで作成していたDLL(ボーランド: 非常に良いIDE/RAD)。

私は面取り法によりDerived1をエクスポートし、クライアントコードDerived1Derived2のインスタンスを作成します。 Derived1Derived2は、別のdllに含まれるポインタ関数を共有しているので、そのポインタ関数をBaseクラスの下に置きます。

ここに問題があります。いったん私はDerived1の1つのインスタンス(工場経由)を作成し、Derived2の複数のインスタンスを作成することができるので、の場合は1、Derived2の場合は1回多く、Baseクラスのコンストラクタが呼び出されます。

ベースの複数のインテンシティを防ぐにはどうすればよいですか?

さらに質問:私は先に説明したシナリオに

Derived2両方Derived1Derived2Derived1呼び出し複数intancesは、固有の共通のベースクラスを拡張します。私は尋ねる:それは悪いデザインですか?私が使ったものよりも、クラスとその継承階層の別のデザインがありますか?

答えて

1

Baseの複数のインスタンスを防ぐことはできません。あなたは、ポインタの複数のインスタンスを防ぐことができます - それは、静的ます

class Base { 
    public: 
     // save first pointer I get passed 
     Base(sometype * p) { 
      if (myptr == 0) { 
       myptr = p; 
      } 
     } 

    private: 

     static sometype * myptr; 
}; 

C++ソースファイルでは、あなたがmyptr定義する必要があります:派生*のすべてのインスタンスがベースにあるので

sometype * Base::myptr = 0; 
+0

を:: Base()はBaseのインスタンスを扱うため、絶対に必要とするためBaseの複数インスタンスを実際には防ぐことはできません。 Neilはあなたの問題を解決するためにfunctionPtrを静的にすることについて絶対に正しいです。 – AndreasT