>source

상속받은 클래스가 여러 개 있는데, 오류 C2<int (__cdecl *)(int)>': no appropriate default constructor available 가 발생합니다. 하지만 C1,C2 에 대한 매개 변수 생성자를 정의했습니다. .

관련 질문은 ??? 로 표시된 주석 행을 보았습니다.  일부 코드에서. 그것은 무엇을 의미합니까- C2 의 기본 생성자를 초기화하고 있습니다.   C3 에서 ?

#include <iostream>
int y(int) 
{ int a=1; return a } 
template<typename F>
class C1
{
public:
    F f1;
    C1(F g) : f1(g) {}  
};
template<typename F>
class C2 : public C1<F>
{
public:
    F f2;
    C2(F g) : f2(g) {}  
};
template<typename F>
class C3 : public C2<F>
{
public:
    F f3;
    C3(F g) : f3(g) {}
    //C3 (F g) : C2<F>(g) {}        ???
};

int main()
{
    C1 o1(y);
    C2 o2(y);
    C3 o3(y);
}

  • 답변 # 1

    다른 클래스의 자식 클래스를 생성 할 때 부모의 기본 생성자 ( ??? 로 표시된 것과 같이 명시 적으로 호출되지 않는 한) )가 호출됩니다. 그러나 각 클래스에 대한 생성자를 제공 한 것처럼 컴파일러는 암시 적 기본 생성자를 생성하지 않았습니다. 따라서 C2 의 인스턴스를 만들 때 컴파일러가 누락 된 기본 생성자 인 C1 를 호출하려고합니다. 찾을 수 없습니다.

    기본 생성자를 제공하면 다음과 같이 작동합니다.

    #include <iostream>
    int y(int) {
        int a=1;
        return a;
    } 
    template<typename F>
    class C1 {
    public:
        F f1{};
        C1() = default;
        C1(F g)
            : f1(g)
        { }  
    };
    template<typename F>
    class C2 : public C1<F>
    {
    public:
        F f2{};
        C2() = default;
        C2(F g) 
            : f2(g)
        { }  
    };
    template<typename F>
    class C3 : public C2<F>
    {
    public:
        F f3{};
        C3() = default;
        C3(F g) 
            : f3(g) 
        { }
        //C3 (F g) : C2<F>(g) {}        ???
    };
    
    int main()
    {
        C1 o1(y);
        C2 o2(y);
        C3 o3(y);
    }
    
    

    ??? 로 표시된 줄  부모 클래스의 기본 생성자에 대한 암시 적 호출에 의존하는 대신 특정 부모 생성자를 호출합니다.

    위와 같이 기본 생성자를 제공하거나 ??? 를 채택 할 수 있습니다  특정 생성자를 호출하는 행 구문-클래스 디자인 및 의도에 따라 다릅니다.

  • 답변 # 2

    샘이 말한 것처럼 C2 생성자가 C1 의 기본 생성자를 호출하려고합니다. 존재하지 않는. 마찬가지로, C3   C2 를 호출하려고합니다 기본 생성자.

    두 가지 수정이 있습니다 :

    C1 의 기본 생성자 정의  그리고 C2 또는 :

    와이즈 비츠 수정 다음과 같이 존재하는 생성자를 호출하는 생성자 :

    C2

    와 비슷하게 C2(F g) : C1 <F> (g), f2(g) {} s 생성자 :

    C3

    자신의 두 번째 질문에 답하는 것은 제 생각입니다.

  • 답변 # 3

    C3(F g) : C2 <F> (g), f3(g) {}  생성자를 호출하여 기본 클래스를 초기화합니다. 생성자를 직접 호출하지 않으면 컴파일러는 기본 클래스 ( C2<F>(g) )의 기본 생성자를 호출하려고 시도합니다. ) 대신에 어떤 클래스에도 오류의 원인이되는 기본 생성자가 없습니다. 하지만 실제로해야 할 일은 기본 클래스 생성자를 직접 호출하는 것입니다.

    C2<F>::C2()
    
    

    C2(F g) : C1<F>(g), f2(g) {} C3(F g) : C2<F>(g), f3(g) {}

관련 자료

  • 이전 bash - 터미널에서 Anaconda2 PATH를 내보내는 방법
  • 다음 Android Studio Visual xml Editor가 작동하지 않습니다