2013-03-26 2 views
0

전 레거시 코드를 이식하는 작업을 맡았습니다. 이전에 유감스럽게도 모범 사례를 가능한 한 많이 따르고 싶습니다. 아래는 문제의 기본 프레임 워크는 내가으로 실행했습니다있다 : 나는 new 생성자에 사용되는 클래스의 복사 생성자를 작성하는 가장 좋은 방법이 있다고 읽은 이후CObject의 자식 복사 생성자 이니셜 라이저 목록

class Foo : public CPropertyPage 
{ 
    // Constructor 
    Foo() : CPropertyPage(Foo::ID) 
    { 
     pBar = new Bar(); 
     // init other things 
    } 

    // Copy Constructor 
    Foo(const Foo& other) : CPropertPage(other) // C2248 compiler error 
    { 
     pBar = new Bar(*other.pBar); 
     // copy other things 
    } 
} 

, 그게 무슨이다 나는하려고 애쓴다. 내가하고 싶은 일은 Foo의 복사 생성자 이니셜 라이저 목록에 CPropertyPage의 복사본 생성자가 포함되어 있지만 CPropertyPage은 복사 생성자가 private 인 MFC 클래스 CObject의 자식이므로 허용되지 않습니다. Foo의 생성자 initializer 목록에 사용 된 생성자를 시도하면 컴파일되지만, CPropertyPage의 복사 생성자와 동일한 끝을 얻었는지 확실하지 않습니다. (면책 조항 : 생성자 및 초기화 목록을 복사하는 것이 매우 쉽습니다) .

따라서 Foo의 복사본 생성자를 어떻게 적절하게 쓸 수 있습니까? 내 접근 방식은 근본적으로 어떤면에서 결함이 있습니까?

편집 :

http://msdn.microsoft.com/en-us/library/ccb3dh5c.aspx

내 정적 분석 도구는 조금 지나치게 당하고 밝혀 : 구문 수정의 시도는, 아래

+4

'public class Foo'? 그것은 C++가 아닙니다. 그리고 C++과 비슷한 언어가 클래스 정의 내에서 범위 지정 연산자 ('Foo :: Foo')를 필요로하는지 의심 스럽습니다. –

+0

@ JoachimPileborg 나는 그가 CPP 파일에서 복사/붙여 넣기 한 것 같은 추측을하고, 우리 눈에 좋게하기 위해 인라인으로 만들었다. 두 경우 모두 그가 원하는 것을 쉽게 이해할 수 있습니다. –

+0

@ ThePhD 기본적으로 그렇습니다. 구문이 완벽하지는 않지만, 내가 묻는 바를 얻지 못한다고 생각합니다. –

답변

1

은 MSDN 링크가이 문제에 관한됩니다 MFC 클래스로 CObject을 확인 이니셜 라이저 목록의 기본 클래스를 확인합니다.

+0

이것을 분명히 함 :'CPropertyPage'는 복사가 불가능하기 때문에 어떤 조치도 취할 필요가 없습니다. 복사 생성자를 실제로 제공하지 않는 한 파생 된 클래스에 대한 복사가 비활성화됩니다. –

관련 문제