C ++私有拷贝构造函数问题

时间:2013-04-28 17:40:17

标签: c++ syntax

我正在构建一个小型C ++应用程序,我正在寻找为我的参考持有者制作一个私有的复制构造函数。

当我在我的主要课程中使用我的课程时,一切正常,但当我尝试使用Google Test测试它时,我收到一条错误,指出我的复制构造函数是私有的

TEST (Library, constructorParams) {
    Library lib = Library("my Library");
    ASSERT_EQ("my Library", lib.getNom());
}

Library.h(我的.cpp中没有复制构造函数和赋值运算符的定义)

class Library {
public:
    ...
private:
    ...

    Library (const Library& obj);
    Library & operator=(const Library& obj);
};

为什么我的私有拷贝构造函数出错(可能在我的测试中使用不当?)?

3 个答案:

答案 0 :(得分:8)

下面

Library lib = Library("my Library");

您在语义上从RHS上构建的临时对象执行复制构造。即使编译器可能会优化副本,复制构造函数也需要公开访问。

请改为尝试:

Library lib("my Library");

有关copy initialization的更多信息,请参阅

答案 1 :(得分:4)

Library lib = Library("my Library");

在这一行中,您尝试复制构造类型为Library的对象,但由于其复制构造函数是私有的,因此无法完成此操作。你应该这样做:

Library lib("my Library");

答案 2 :(得分:2)

您正在从此代码行中调用复制构造函数

Library lib = Library("my Library");

您已将其定义为该类的私有方法。

该操作与对赋值运算符的调用无关(您在问题中提到),如果您考虑其等价物,则更清楚:

Library lib(Library("my Library"));  // Here the invocation of the copy 
                                     // constructor is more explicit

使用这种格式的代码,更清楚的是,不需要首先在临时中创建对象,而不是调用复制构造函数来创建该对象的另一个实例。

正确的方法应该是:

Library lib("my Library");