我收到以下代码的编译错误,但如果我删除了复制构造函数语句,则会编译相同的错误。
有人能让我知道这种行为吗?
class MyClass
{
private:
int i;
MyClass(MyClass &);
public:
MyClass():i(0){}
};
int main(){
MyClass obj = MyClass();
return 0;
}
错误是:
MyClass.cpp: In function ‘int main()’: MyClass.cpp:15:24: error: no matching function for call to ‘MyClass::MyClass(MyClass)’ MyClass.cpp:15:24: note: candidates are: MyClass.cpp:11:2: note: MyClass::MyClass(MyClass&) MyClass.cpp:11:2: note: no known conversion for argument 1 from ‘MyClass’ to ‘MyClass&’ MyClass.cpp:10:2: note: MyClass::MyClass() MyClass.cpp:10:2: note: candidate expects 0 arguments, 1 provided
答案 0 :(得分:3)
这是因为您的复制构造函数是私有的,并且您没有实现它。你公开并实施它。你也忘记了const
。
class MyClass
{
private:
int i;
public:
MyClass():i(0){}
MyClass(MyClass const & o){ i = o.i; }
};
int main(){
MyClass obj = MyClass();
return 0;
}
答案 1 :(得分:0)
当程序员希望让你知道未来程序员不打算复制这个对象时,会使用私有的未实现的复制构造函数。虽然更常见的是还包括私有部分中的复制构造函数,也没有像这样实现
private:
obj(const obj& o);
obj& operator=(const obj& o);
public:
obj(...)
{
...
}
如果由于使用的是具有私有拷贝构造函数的库类而出现错误,并且您正在尝试复制该对象,从而导致编译器错误
error C2248: 'obj::obj' : cannot access private member declared in class 'obj'
error C2248: 'obj::operator =' : cannot access private member declared in class 'obj'
然后您没有按预期使用该课程。
如果您自己创建一个对象并且确实希望将其复制,那么您需要实现一个公共构造函数,复制构造函数和赋值运算符,然后提供实现所有三个函数的代码。