1

我需要使用包含一些不可复制类的代码库。他们已将赋值运算符和复制构造函数声明为私有。如何在我的类中初始化这些类型的成员?例如:

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_copyablein 的指针my_class

4

3 回答 3

8

您在这里调用复制构造函数,因为您是trouble从临时non_copyable实例构造的:

trouble(non_copyable(good_one))
//        ^^^ temporary non_copyable.

尝试这个:

trouble(good_one)
于 2013-06-14T12:49:46.987 回答
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)
于 2013-06-14T12:53:53.660 回答
2

假设麻烦类需要good_one构造;即有一个以anormal_class为参数的构造函数;你可以试试这个:

my_class::my_class() :
        good_one(normal_class(0,0)), 
        trouble(good_one) { 
}

但是在任何情况下,您都依赖于以正确的顺序调用初始化列表(因为麻烦取决于good_one被初始化)。在不同的编译器甚至不同的编译器选项上可能不是这种情况。

我建议不要使用这种模式,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); 
}
于 2013-06-14T12:56:34.070 回答