2

我有一个struct A具有多个初始化不同数据成员的构造函数。

template<typename T>
    struct A {

    typedef std::vector<T> type1
    type1 a;
    type1 b;
    type1 c;

    A(type1 i_a): a(i_a) {
    }

    A(type1 i_a, type1 i_b): A(i_a), b(i_b) {
    }

    A(type1 i_a, type1 i_b, type1 i_c): A(i_a, i_b), c(i_c) {
    }
};

我得到的错误是当我用 say 实例化它时custom_type,错误 type A<custom_type> is not direct base of A<custom_type>突出显示了我在另一个构造函数中调用的构造函数。我正在使用 C++11。有什么问题?

4

3 回答 3

7

构造函数可以初始化它的基类和成员,或者委托给同一类的另一个构造函数,而不是两者。

A(i_a)构造一个完整的A对象,复制成员a和默认构造band c。所以没有意义A(type1 i_a, type1 i_b): A(i_a), b(i_b) {}- 第一个初始化程序已经初始化b。你可以改为

A(type1 i_a, type1 i_b) : A(i_a) { b = std::move(i_b); }
于 2013-03-15T17:43:06.453 回答
1

aschepler 提供了答案,但我想解释导致问题的原因并展示委托构造函数以避免它的“最佳实践”。

在您的代码中,您有一系列构造函数,每个构造函数都比它们委托的构造函数更通用。那就是你试图让一个构造函数委托给一个更专业的构造函数,它不会做任何事情,然后你需要做一些工作来处理额外的通用性。这与支持它的早期语言中被证明是最实用的构造委托方式相反。

相反,您想要的是让最通用的构造函数成为委托的“根”(其他语言中的“指定初始化程序”或“指定构造函数”)。更专业的构造函数将使用更通用的构造函数来完成它们的工作,将数据传递给它们以供处理特殊情况。

在您的情况下,专门的行为是对某些成员使用默认值,而不是从用户那里获取初始值。因此,您更专业的构造函数将通过传递它们给出的参数以及其他成员的默认值来完成他们的工作。

template<typename T>
struct A
{
    typedef std::vector<T> type1;
    type1 a;
    type1 b;
    type1 c;

    A(type1 i_a, type1 i_b, type1 i_c): a(i_a), b(i_b), c(i_c) {}

    A(type1 i_a, type1 i_b): A(i_a, i_b, {}) {}

    A(type1 i_a): A(i_a, {}) {}
};
于 2013-03-15T18:38:05.967 回答
0

但是您仍然可以从构造函数的主体中调用同一类的不同构造函数(如果出于某种原因您想要)

class CComplex{
public:
    CComplex(int real1,int image1,char c)
    {
        cout<<"RealImg";
        real=real1;
        image=image1;
        char* x; char xc=c;x=&xc;
        void* v;
        f(x);
        CComplex ccc(x,v); //this is OK
        CComplex cccc(1,2,3); //as this too
    }
    CComplex():real(0),image(0){cout<<"DEFAULT";}
    CComplex(const CComplex &c)
    {
        real=c.real;
        image=c.image;
        cout<<"COPY";
    }
    CComplex& operator=(CComplex const& ref){ 
        cout<<"ASSIGN";
        //CComplex* c;
        CComplex cobj(43,45,'x');
        //c=&cobj;
        //CComplex* c=new CComplex(44,45); 
        return cobj;
    }

    CComplex(int i1, int i2, int i3){cout<<"\n123!";}
    CComplex(const char* y,void* v){cout<<"\nCrefvoid!";}
    ~CComplex(){cout<<"\n~CComplex(){}";}
public:
    void Display(void)
    {
        cout<<real<<"+"<<image<<"i"<<endl;
    }
    static bool CComplexComparator(CComplex c1, CComplex c2){return true;}
    static void CComplexInit(CComplex& c){
        c.real=100;
    }
    int real,image;
}; 
于 2013-03-15T18:12:04.087 回答