首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++私有副本构造函数问题

C++私有副本构造函数问题
EN

Stack Overflow用户
提问于 2013-04-29 01:40:17
回答 3查看 226关注 0票数 3

我正在构建一个小的C++应用程序,我希望为我的参考持有者制作一个私人的拷贝构造函数。

当我在main中使用我的类时,一切都正常,但是当我尝试用Google Test测试它时,我得到一个错误,声明我的复制构造函数是私有的

代码语言:javascript
复制
TEST (Library, constructorParams) {
    Library lib = Library("my Library");
    ASSERT_EQ("my Library", lib.getNom());
}

H(在我的.cpp中没有对复制构造函数和赋值操作符的定义)

代码语言:javascript
复制
class Library {
public:
    ...
private:
    ...

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

为什么我的私有拷贝构造函数会出现错误(这在我的测试中可能是一个糟糕的用法?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-29 01:43:41

这里

代码语言:javascript
复制
Library lib = Library("my Library");

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

试着这样做:

代码语言:javascript
复制
Library lib("my Library");

请参阅copy initialization上的更多内容。

票数 8
EN

Stack Overflow用户

发布于 2013-04-29 01:42:42

代码语言:javascript
复制
Library lib = Library("my Library");

在这一行中,您试图复制构造一个Library类型的对象,但这不能完成,因为它的复制构造函数是私有的。相反,您应该这样做:

代码语言:javascript
复制
Library lib("my Library");
票数 4
EN

Stack Overflow用户

发布于 2013-04-29 01:45:39

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

代码语言:javascript
复制
Library lib = Library("my Library");

并且您已经将它定义为该类的私有方法。

该操作与调用赋值运算符(您在问题中提到的)无关,如果您考虑它的等价物,这一点就会更清楚:

代码语言:javascript
复制
Library lib(Library("my Library"));  // Here the invocation of the copy 
                                     // constructor is more explicit

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

正确的方法应该是:

代码语言:javascript
复制
Library lib("my Library");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16265736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档