有人可以告诉我为什么编译器会为此提出错误。
class A
{
private:
int data;
public:
A();
A(A& a) { this->data = a.data; }
};
void main()
{
A a();
A b(a);
}
我得到的错误就是这个。
error C2664: 'A::A(A &)' : cannot convert parameter 1 from
'A (__cdecl *)(void)' to 'A &'
答案 0 :(得分:9)
A a();
这是函数的前向声明,它返回A
并且不带参数。所以,你试图将一个函数指针传递给你的构造函数,这当然不起作用,因为不存在这样的构造函数。如果要使用默认构造函数,请使用:
A a;
当然,没有定义该构造函数。你需要添加一个定义(你只写了一个声明)。
撇开; main
被定义为返回int
,您应该在构造函数中使用const引用。
A(const A &other) : data(other.data) {}
答案 1 :(得分:1)
首先应该是int main()
,其次构造函数`A()
没有正文
它也应该是A a;
而不是A a();
修改强>
更好的是A(A& a) { this->data = a.data; }
应该阅读A(const A& a) { this->data = a.data; }
答案 2 :(得分:-1)
试试这个:
class A
{
public:
int data;
public:
A(){this->data = 0;}
A(A& a) { this->data = a.data; }
};
int main()
{
A a;
A b(a);
}
在Main中,声明
A a();
更改为:
A a;
因为编译器试图将括号识别为不存在的运算符。 “默认”构造函数已更改,因为链接器未识别该符号已被使用。您可以通过在基类中编程来覆盖此行为,该基类利用其构造函数中的数据字段。