我需要使用包含一些不可复制类的代码库。他们已将其赋值运算符和复制构造函数声明为私有。如何在我的课程中初始化这些类型的成员?例如:
class non_copyable; // defined somewhere.
// constructor receives a parameter of type `normal_class'
// my_class.hpp
class my_class {
public:
my_class();
virtual ~my_class();
private:
normal_class good_one;
non_copyable trouble;
};
my_class::my_class() :
good_one(normal_class(0,0)),
trouble(non_copyable(good_one)) { // ====> error
}
目前,我在non_copyable
使用指向my_class
的指针。
答案 0 :(得分:8)
您正在此处调用复制构造函数,因为您正在从临时trouble
实例构建non_copyable
:
trouble(non_copyable(good_one))
// ^^^ temporary non_copyable.
试试这个:
trouble(good_one)
答案 1 :(得分:2)
你为自己制造麻烦
my_class::my_class() :
good_one(normal_class(0,0)),
trouble(non_copyable(good_one))
应该只是
my_class::my_class() :
good_one(0,0),
trouble(good_one)
答案 2 :(得分:2)
假设麻烦类需要good_one
来构建;即有一个以normal_class
为参数的构造函数;你可以试试这个:
my_class::my_class() :
good_one(normal_class(0,0)),
trouble(good_one) {
}
但在任何情况下,你都依赖于以正确的顺序调用初始化列表(因为麻烦取决于good_one
被初始化)。在不同的编译器甚至不同的编译器选项上可能不是这种情况。
我建议不要使用此模式,初始化initalizer列表中的good_one
,然后在构造函数中执行类似trouble.SetObject(good_one)
的操作。
或者可能将麻烦转换为
non_copyable* trouble;
[...]
my_class::my_class() :
good_one(normal_class(0,0))
{
trouble = new non_copyable(good_one);
}