初始化禁止复制的成员类

iha*_*ter 1 c++ constructor

我有一个成员变量,它是一个禁止复制的类(删除了复制赋值运算符)。我想进行一些检查以确定将成员初始化为什么,因此我需要在构造函数中而不是在初始化列表中执行此操作。在进入 MyClass 的构造函数之前,成员变量 m 似乎已经用默认构造函数进行了初始化,那么构造函数的意义何在……对不起,c++ 咆哮。

简单的例子:

class MyClass {
    NonCopy m;
    MyClass() {
        // Complex checks
        if(success) {
            m("success");
        else {
            m("failure");
        }

    }
Run Code Online (Sandbox Code Playgroud)

我看到的选项是:

  • 驻留在m的动态分配
  • 放宽复印禁止要求

Nat*_*ica 5

只要该类具有有效的复制或移动构造函数,或者您使用的是 C++17+,您就可以创建一个执行逻辑的辅助函数,然后返回正确的对象。然后使用它来初始化您的成员。那看起来像

class MyClass {
    NonCopy m;
    static NonCopy initialize_noncopy()
    {
        // Complex checks
        if(success) {
            return NonCopy("success");
        else {
            return NonCopy("faulure");
        }
    }
public:
    MyClass() : m(initialize_noncopy()) { }
};
Run Code Online (Sandbox Code Playgroud)

  • @AyxanHaqverdili 取决于。如果您不能使用 C++17,或者该类没有复制/移动 c'tor,那么是的,这可能是要走的路。但我试图避免它,并尝试将该逻辑放入命名函数中。另外,虽然示例代码中的检查很简单,但注释显示“复杂检查”,这很可能意味着在OP的实际代码中,像这样的简单检查可能还不够。因此,我展示了这种方法。 (2认同)