2010-01-07 5 views
1

나는 가상의 기본 클래스 인 Foo를 사용하여 다른 많은 클래스를 작게 파생 시켰습니다. 파생 된 클래스를 만들고 Foo *를 반환하는 팩토리가 있습니다. 내 큰 문제 중 하나는 내 과부하입니다. DFoo가 DFoo1에 의해 작동하지 않도록해야합니다 (표시되지 않음). 현재 캐스트가 실패했는지 확인하면서이 문제를 처리했지만, 나는 그 접근법에 꽤 만족하지 않습니다. 공장에서 기본 클래스 만 반환 할 수 있기 때문에 기본 구현을 사용해야합니다. 이것이 이것이 최선의 방법이라면, 괜찮습니다. 단지 이것이 의미가 있고 내가 놓친 패턴이 없다는 것을 확실히하고 싶습니다. 이런 종류의 일을 처리하는 방법에 대한 제안은 대단히 감사하겠습니다.상속 및 가상 기본 클래스가있는 할당 연산자

class Foo 
{ 
    public: 
      Foo(int x){...}; 
      Bar m_bar; 
      virtual Foo& operator=(const Foo& f) 
      { 
      m_bar = f.m_bar 
      } 
} 

이제 내 파생 클래스

class DFoo : public Foo 
{ 
    DFoo(int x, int y):Foo(int x) {...} 
    FooBar m_foobar; 

    Foo& operator=(const Foo& rhs) 
    { 
     if(this != &rhs) 
     { 

       Foo::operator=(rhs); 
       DFoo temp = static_cast<DFoo>(rhs); 

       if(temp != NULL) 
       { 
       m_foobar = static_cast<DFoo>(rhs).m_foobar; 
       } 
       else 
       throw exception(ex); 
     } 
    } 
} 
+0

사실, 클래스 계층 구조에 operator =()를 구현해야한다면, 제 디자인을 다시 한 번 살펴 보겠습니다. –

+2

이 코드는 설명하는 것을 수행하지 않습니다. 나는 당신이 작성한 것 대신에'dynamic_cast'와'DFoo &'를 사용하고자한다고 생각합니다. –

+0

'if (temp! = NULL)'은 무엇을하나요? temp는 포인터가 아니며 포인터 인 경우 참조에서 가져오고 NULL이 될 수 없습니다. – Potatoswatter

답변

1

당신은 아마 boost::noncopyable 찾고 있습니다.

+0

예, 삶이 훨씬 쉬워 질 것입니다. 감사 – Steve

1

이 상황에서 가장 현명한 일은 할당 연산자를 선언하고 생성자를 복사하지만 정의하지 않는 것입니다. 그런 다음 코드 어딘가에서 누군가 복사를 시도하면 링커 오류가 발생합니다. 기본적으로 boost :: nocopyable의 효과는 간단하고 사소한 작업을 위해 외부 라이브러리를 가져 오지 않는다는 것입니다.

편집 : 또한 생성자와 연산자를 비공개로 설정하면 컴파일러 오류가 발생합니다.

1

이 작업을 수행해서는 안 :

class DFoo 
{ 
    Foo& operator=(const Foo& rhs) ; 
}; 

명시 적으로 파생 된 유형 (가능성)에 기본 클래스의 할당을 지원하고자하지 않는 한.
assignemtn 연산자는 다음과 같아야합니다

class DFoo 
{ 
    DFoo& operator=(DFoo const& rhs); // You can only assign DFoo to a DFoo. 
             // Now there is no way for DFoo1 to get assigned to a DFoo 
}; 

을 또한 예상대로 작동합니다 컴파일러에 의해 생성 된 기본 assignent 연산자를 게시이 사소한 예에. 할당 연산자를 쓰는 특별한 이유가 있습니까?