错误消息:具有复制构造函数和重载的赋值运算符

时间:2019-07-14 17:46:41

标签: c++ overloading copy-constructor assignment-operator

这是我较早前提出的一个问题。 我在使用论坛建议的复制构造函数时遇到编译错误。

class A
{
private:
    int a;
    int b;


public:

    A() { a = 0; b = 0; }
    int getA() { return a; }
    int getB() { return b; }
    A(const Beta& b) :a{ *b.X() }, b{ *b.Y } {} 

};

class Beta
{
private:
    int *x;
    int *y;

public:
    Beta(int a, int b) { x =&a; y = &b; }
    int* X() { return x; }
    int* Y() { return y; }

};

int main()
{
    B aObject;
    Alpha a1 = aBObject;
    Alpha a2;
    a2 = aBObject;

    return 0;

}

复制构造函数参数中没有const Alpha(Beta&be)

Error   C2061   syntax error: identifier 'Beta' 
Error   C2228   left of '.getY' must have class/struct/union 
Error   C2228   left of '.getX' must have class/struct/union 
Error   C2679   binary '=': no operator found which takes a right-hand operand of type 'Beta' (or there is no acceptable conversion)
Error   C2440   'initializing': cannot convert from 'Beta' to 'Alpha' 
Error   C2065   'be': undeclared identifier 
Error   C2535   'Alpha::Alpha(void)': member function already defined or declared 

在复制构造函数参数中使用const Alpha(const Beta&be)

Error (active)  the object has type qualifiers that are not compatible with the member function "Beta::getX" 
Error (active)  the object has type qualifiers that are not compatible with the member function "Beta::getY" 

Error   C2061   syntax error: identifier 'Beta' 
Error   C2228   left of '.getY' must have class/struct/union 
Error   C2228   left of '.getX' must have class/struct/union 
Error   C2679   binary '=': no operator found which takes a right-hand operand of type 'Beta' (or there is no acceptable conversion)
Error   C2440   'initializing': cannot convert from 'Beta' to 'Alpha' 
Error   C2065   'be': undeclared identifier 
Error   C2535   'Alpha::Alpha(void)': member function already defined or declared

2 个答案:

答案 0 :(得分:1)

这是您想要的吗?

class Beta
{
private:
    int *x;
    int *y;

public:
    Beta() { x = nullptr; y = nullptr; }
    int* getX() { return x; }
    int* getY() { return y; }

};

class Alpha
{
private:
    int a;
    int b;


public:

    Alpha() { a = 0; b = 0; }
    int getA() { return a; }
    int getB() { return b; }
    Alpha( Beta& be) :a{ *be.getX() }, b{ *be.getY() } {} 
//It is not copy Constructor. You can't pass const reference here because getX getY returns pointer. So it could break const contract

};



int main()
{
    Beta aBetaObject;
    Alpha a1 = aBetaObject;
    Alpha a2;
    a2 = aBetaObject;

    return 0;

}

答案 1 :(得分:0)

您的代码中没有复制构造函数(或赋值运算符)。但这不是问题。他们发出的问题是,Alpha的代码在定义Beta之前就使用Beta。这就是编译器所抱怨的,在您初次使用Beta时无法识别它。

只需移动Beta,使其定义在Alpha之前,一切都将编译。