在调用 Base class 构造函数之前初始化 Derived class 成员变量。这是UB吗?

Initialize Derived class member variable before calling Base class constructor. Is this UB?

我想初始化 Derived class 的成员变量,然后将其传递给 Base class 构造函数。我想出了下面的解决方案(也在这里:http://cpp.sh/4uu4q

1) 以下代码是否具有已定义或未定义的行为 (UB)?

2) 我正在尝试做的事情是否表明设计不好?

struct Data {
    int fValue;

    Data( int value = -1 ) : fValue( value )
    {}
};


struct Base {
    Base( const std::unique_ptr<Data> & derivedData ) {
        std::cout << "Constructing Base derivedData=" << derivedData->fValue << std::endl;
    }
};


struct Derived : public Base {
    std::unique_ptr<Data> fData = std::move( fData );

    Derived() : Base( ConstructData() )
    {}

    const std::unique_ptr<Data> & ConstructData() {
        fData.release();
        fData.reset( new Data(777) );
        std::cout << "in ConstructData: fData->fValue =" << fData->fValue << std::endl;
        return fData;
    }
};


int main() {
    Derived d;
    std::cout << "In main: d.fData->fValue =" << d.fData->fValue << std::endl;
    return 0;
}

I would like to initialize a member variable of a Derived class, and after that pass it to the Base class constructor.

在 C++ 中,构造顺序是基础部分在派生部分之前。这是因为派生部分(可能)根据基础部分构建更为常见。为了明确定义,指定了先基后派生的顺序。因此,在基础中使用 derived 是未定义的。

如果您希望您的基使用派生成员,有一种方法可以确保顺序正确。也使 "members" 基础 类 。请注意,boost::base_from_member 正是为了让这更方便而构建的。

说你有一些

class member_type{};

并且您希望 derived 有一个 member_type 成员,并且派生自 base。那么你可以使用:

class derived : 
    private boost::base_from_member<member_type>,
    public base {
    using my_member_type = private boost::base_from_member<member_type>;

public:
    derived();
};

请注意,现在 derived sub类 my_member_typebase(按此顺序)。因此,后者可以在其构造中使用前者。

derived::derived() : 
    my_member_type{3},
    base{my_member_type::member} {
}