원인

이 오류는 클래스 생성자에 대한 빌드 스텁에서 발생합니다. 클래스 Derived가 클래스 Base를 상속받는 경우, Derived의 객체를 생성할 때 Base의 생성자가 먼저 호출됩니다. 이 때, Derived의 생성자에서 Base의 생성자를 명시적으로 호출하지 않더라도 Base의 기본 생성자가 자동으로 호출됩니다. Base에 기본 생성자가 없는 경우에는 Derived의 생성자에서 명시적으로 Base의 생성자를 호출하여야 합니다. 생성자 코드에서 부모 클래스의 생성자를 명시적으로 호출하지 않거나, 적절하지 않은 생성자를 호출한 경우 컴파일 오류가 발생할 수 있습니다.

해결 방법

소스 코드를 참고하여 부모 클래스의 생성자를 호출하는 적절한 코드를 빌드 스텁에 추가하여 해결할 수 있습니다. 타입 구조가 복잡한 경우, 아래 예시처럼 연관된 타입을 모두 확인하여 적절한 초기화 코드를 작성하여야 합니다. CT 2024.06의 [스텁 문제 해결 가이드] 대화 상자에서 초기화 코드를 작성할 때 참고할 수 있는 코드의 위치를 표시해줍니다. 이 위치를 참고하면 문제 해결에 도움이 될 수 있습니다.

예시

소스 코드와 스텁 코드의 예시입니다.

// 소스 코드
class BaseClass {
public:
 	BaseClass() = delete;
 	BaseClass(int t) {}
 };

 class DerivedClass : public BaseClass {
 public:
 	DerivedClass() = delete;
 	DerivedClass(BaseClass a) : BaseClass(1) {}
 };

 class FinalClass : public DerivedClass {
 public:
 	FinalClass(int a);
 };

 void test(FinalClass a) {

 }
// 스텁 코드
FinalClass::FinalClass(int a):
  DerivedClass()
{
/// Stub body start

/// Stub body end
}

[오류 뷰]를 확인하면 부모 클래스 DerivedClass의 초기화 코드가 잘못되었다는 것을 알 수 있습니다.

부모 클래스 DerivedClass를 올바르게 초기화하기 위해 DerivedClass 클래스의 생성자 DerivedClass(BaseClass a) : BaseClass(1){}를 확인합니다. DerivedClass 클래스를 초기화하기 위해 BaseClass 클래스의 객체가 필요합니다. BaseClass 클래스의 객체를 생성하기 위해 BaseClass 클래스의 생성자 BaseClass(int t)를 확인합니다. BaseClass 클래스의 객체는 int 타입 한 개를 매개변수로 받아 생성됩니다. DerivedClass 클래스의 생성자와 BaseClass 클래스의 생성자를 참고하여 다음과 같이 초기화 코드를 작성합니다.

DerivedClass(BaseClass(1))  // 매개 변수의 값은 테스트 설계에 맞게 적절히 입력하세요.

이를 적용하여 새로 작성된 스텁 코드입니다.

// 수정된 스텁 코드
 FinalClass::FinalClass(int a):
DerivedClass(BaseClass(1))     // 매개 변수의 값은 테스트 설계에 맞게 적절히 입력하세요.
{
/// Stub body start

/// Stub body end
}

테스트를 다시 실행하거나 테스트 컴파일을 사용하면 스텁의 오류가 해결된 것을 알 수 있습니다.

Need more help with this?
Don’t hesitate to contact us here.

Thanks for your feedback.