2009-08-10 3 views
12

내 소프트웨어에서 클래스의 전달 선언을 사용하고자하므로 typedef가
이 될 수 있으며이를 클래스 전체 선언에 사용할 수 있습니다. 이 같은C++ 클래스 전달 선언 단점?

떨어지게 :

class myclass; 
typedef boost::shared_ptr<myclass> pmyclass; 
typedef std::list<pmyclass > myclasslist; 

class myclass : public baseclass 
{ 
private:  // private member declarations 
     __fastcall myclass(); 

public:   // public member declarations 
     __fastcall myclass(myclass *Parent) 
      : mEntry(new myclass2()) 
      { 
      this->mParent = Parent; 
      } 
     const myclass *mParent; 
     myclasslist mChildren; 
     boost::scoped_ptr<myclass2> mEntry; 
}; 

그래서 내 질문 :이 방법의 모든 단점이 이 있습니까? 전방 선언으로 소멸자 문제에 대한 토론을 회상하지만, 모든 것을 꺼내지는 못했습니다.
또는 이와 유사한 것을 구현하는 다른 옵션이 있습니까?

감사합니다.

편집 :

5.3.5/5 :

"삭제되는 객체가있는 경우 불완전한 클래스 유형 C++ 표준에서 here

답변

5

: 내가 언급 된 토론을 발견 삭제 시점에 전체 클래스가 중요하지 않은 소멸자 또는 할당 취소 함수를 가지고있는 경우 동작은 정의되지 않습니다. "

+0

음, 어리 석음에 대해 미안하지만 이전에 읽었습니다. 내 질문은 여기에 있습니다 : 선언 직후에 아무런 문제가 없다고 정의 된 경우, 맞습니까? – Andrew

+1

네, 그게 내가 그것을 읽는 방법입니다. 우리의 컴파일러가 표준을 준수하도록 노력하겠습니다 :-) –

22

주요 단점은 모든 것입니다. 전방 선언은 컴파일 시간을 절약하고 객체간에 주기적 종속성을 갖는 타협점입니다. 그러나 비용은 참조 유형으로 만 유형을 사용할 수 있으며 이러한 참조 유형으로는 아무 것도 할 수 없습니다. 즉, 상속도, 값으로 전달도, 클래스 내의 중첩 된 유형이나 typedef도 사용하지 않는 등의 모든 큰 단점이 있습니다.

당신이 말하고있는 특정 파괴 문제는 타입을 선언하고 모듈에서만 그것을 삭제하면, 그 행동은 정의되지 않았고 오류는 발생하지 않습니다. 예를 들어

:

class A; 

struct C 
{ 
    F(A* a) 
    { 
     delete a; // OUCH! 
    } 
} 

마이크로 소프트 C++ 2008 어떤 소멸자를 호출하고 다음과 같은 경고가 발생하지 않습니다 :

warning C4150: deletion of pointer to incomplete type 'A'; no destructor called 
      : see declaration of 'A' 

그래서 당신은 경고를 유지해야 문제의 경우 안 경고를 오류로 처리하고 있습니다.

+5

고통으로 인해 한 달에 30 분의 컴파일 시간이 절약되지만 앞으로 선언 된 두통으로 시간이 걸릴 수 있습니다 - 그러면 잃을 것입니다 ... CPU를 구입하십시오 더 많은 코어가 있고 병렬 컴파일이 가능합니다. 적어도 더 나은 프레임 속도로 Skyrim을 재생할 수 있습니다. – Eloff