gpt4 book ai didi

c++ - 在调用基类构造函数之前初始化派生类成员变量。这是UB吗?

转载 作者:太空狗 更新时间:2023-10-29 21:14:51 27 4
gpt4 key购买 nike

我想初始化派生类的成员变量,然后将其传递给基类构造函数。我想出了下面的解决方案(也在这里: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 是未定义的。

如果您希望您的基础使用派生成员,有一种方法可以确保顺序正确。也创建“成员”基类。注意 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();
};

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

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

关于c++ - 在调用基类构造函数之前初始化派生类成员变量。这是UB吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39616384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com