2013-02-01 4 views
1

기본 클래스에서 파생 클래스로 변환하려고합니다. 나는, 그러나, 컴파일러는 다음과 같은 생성자를 불평했다 :기본 클래스에서 비정규 클래스로 변환

no matching function for call to ‘baseObject::baseObject()’ 

생성자 :

derivedObject(const baseObject &base, const std::string &extra1) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 

어떤 조언을?

+1

클래스'baseObject'에는 기본 생성자가 없습니다. 우리는'baseObject'를 볼 수 있습니까? – Foggzie

+0

맞습니다.하지만 왜 그 중 하나가 있어야합니다. 전달하는 기본 객체는 이미 생성되어 있어야합니다. – marcwho

+0

파생 된 객체의 생성자는 자동으로 기본 클래스의 생성자를 호출합니다. 이것은'baseObject'가 전달되기 때문에 발생하는 것이 아니라'derivedObject' 자체 때문입니다. – Foggzie

답변

2

모든 생성자는 모든 기본 클래스와 직접 멤버를 초기화하는 것으로 시작한다. 본문에 할당을 사용하는 대신 멤버 이니셜 라이저 목록을 사용하십시오.

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(base),  // Calls the baseObject copy constructor 
     extraParameter1(extra1) // Initialize the direct member 
{ 
} 

이 방법은 더 나은 스타일이며 동시에 실행 한 것과 같은 문제를 피할 수 있습니다.

+0

아 감사합니다! 빠른 질문 비록, 내 자신의 복사본 생성자를 만들어야합니까, 또는 기본 하나 복사 날 위해 데이터 멤버 않습니다? – marcwho

+0

@marcwho 클래스가 복사 생성자 멤버를 선언하지 않으면 컴파일러는 자동으로 'public'을 추가하고 각 기본 클래스와 멤버를 복사합니다. 이것은 일반적으로 충분하지만 (규칙 3 참조). – aschepler

2

편집 : baseObject 복사본 구성.

baseObject에 대한 기본 생성자를 정의하지 않았으므로 컴파일러는 baseObject 생성자에 사용할 명시 적 사양이없는 derivedObject을 생성 할 수 없습니다.

derivedConstructor의 정의에서 정확히 baseObject 생성자를 지정해야합니다. 나는 당신의 baseObject, 나는이 자리 아래 사용했습니다 어떻게 생겼는지 아무 생각이 없기 때문에 : 특정 경우

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(PARAM1, PARAM2) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 

을, 이미 존재하는 baseObject에서 derivedObject을 만들려고하는 경우, 다음과 같이 baseObject 's이 (가) 생성자를 복사 할 정의해야합니다 : 당신이 {에 도착하기 전에

derivedObject(const baseObject &base, const std::string &extra1) 
    : baseObject(base) 
{ 
    baseparameter1 = base.baseparameter1; 
    baseparameter2 = base.baseparameter2; 
    extraparameter1 = extra1; 
} 
+0

OP가 앞으로 나아갈 방향이 후자라고 생각합니다. – WhozCraig

관련 문제