2009-04-26 7 views
1

저는 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).

나는 facotry 메서드를 통해 Derived1을 내보내고 클라이언트 코드를 통해 Derived1Derived2의 인스턴스를 만듭니다. Derived1Derived2은 다른 dll에 포함 된 포인터 함수를 공유하므로이 포인터 함수를 Base 클래스에 넣습니다.

여기에 문제가 있습니다. 한 번 인스턴스 (공장을 통해) Derived1의 인스턴스를 만들고 Derived2의 여러 인스턴스를 만들 수 있습니다, Base 클래스 생성자는 더 많은 시간 (Derived1에 1 및 Derived2에 대해 여러 번) 호출됩니다.

어떻게 Base의 다중 강도를 방지 할 수 있습니까?

또 다른 질문 : 앞서 설명한 시나리오와

, Derived1 호출 여러 Derived2의 intances 모두 Derived1Derived2 고유 공통 기본 클래스를 확장합니다. 나는 묻는다. 그것은 나쁜 디자인인가? 내가 사용했던 것보다 더 우수한 클래스와 상속 계층 구조가 있습니까?

답변

1

여러 개의 Base 인스턴스를 방지 할 수 없습니다. 당신은 포인터의 여러 인스턴스를 방지 할 수 있습니다 - 그것은 정적합니다

는 C++ 소스 파일에서
class Base { 
    public: 
     // save first pointer I get passed 
     Base(sometype * p) { 
      if (myptr == 0) { 
       myptr = p; 
      } 
     } 

    private: 

     static sometype * myptr; 
}; 

당신이 myptr 정의해야합니다 : * 기본이다 파생의 모든 인스턴스 때문에

sometype * Base::myptr = 0; 
+0

을 :: Base()는 Base의 인스턴스를 필요로하므로 실제로 Base가 필요하기 때문에 Base의 여러 인스턴스를 실제로 막을 수는 없습니다. Neil은 문제를 해결하기 위해 functionPtr을 정적으로 만드는 것에 대해 절대적으로 옳습니다. – AndreasT