繁体   English   中英

初始化不可复制的成员

[英]Initializing non-copyable members

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

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指针。

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

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

尝试这个:

trouble(good_one)

你自己找麻烦

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)

假设故障类需要good_one来构造; 例如,有一个使用normal_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); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM