在调用 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_type
和 base
(按此顺序)。因此,后者可以在其构造中使用前者。
derived::derived() :
my_member_type{3},
base{my_member_type::member} {
}
我想初始化 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_type
和 base
(按此顺序)。因此,后者可以在其构造中使用前者。
derived::derived() :
my_member_type{3},
base{my_member_type::member} {
}