3

我正在构建一个小型 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);
};

为什么我的私有复制构造函数出现错误(这可能是我的测试中的错误用法?)?

4

3 回答 3

8

这里

Library lib = Library("my Library");

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

试试这个:

Library lib("my Library");

请参阅有关复制初始化的更多信息。

于 2013-04-28T17:43:41.303 回答
4
Library lib = Library("my Library");

在这一行中,您尝试复制构造 type 的对象Library,但这无法完成,因为它的复制构造函数是私有的。你应该这样做:

Library lib("my Library");
于 2013-04-28T17:42:41.710 回答
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");
于 2013-04-28T17:45:38.720 回答