0

我收到以下代码的编译错误,但如果我删除复制构造函数语句,也会编译相同的错误。

谁能让我知道这种行为?

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 
4

2 回答 2

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;
}
于 2013-09-19T23:29:27.747 回答
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'

那么您没有按预期使用该类。

如果您自己制作一个对象并且确实希望它被复制,那么您需要实现一个公共构造函数、复制构造函数和一个赋值运算符,然后提供实现所有三个函数的代码。

于 2013-09-19T23:41:58.987 回答