[英]How to call parameterized constructor of member object variable in a class' default constructor in C++?
我想在 class 的默认构造函数中初始化成员 object 变量。
让我们考虑以下内容,
class ABC {
ABC(int A, int B) {
a = A;
b = B;
}
int a;
int b;
};
class Foo {
Foo();
ABC m_obj1;
};
从上面的例子中,我想在“Foo::Foo()”中初始化“obj1”。 我的限制之一是我不能在初始化列表中这样做,因为我需要在初始化成员之前进行一些计算。 所以可用的选项(ASFAIK)是只在默认构造函数的主体中这样做。
任何输入,我该怎么做? 编辑:限制为 C++11
这会是一个正确的方法,
Foo:Foo() {
int x = 10;
int y = 100;
m_Obj1(x, y); //Is this correct? <--------
}
根据您的具体问题和要求,可能会提供多种解决方案:
选项 1:使用 function 进行计算并调用Foo
构造函数
Foo makeFoo()
{
// Computations here that initialize A and B for obj1 constructor
return Foo(A, B)
}
选项 2:调用 function 执行计算并在Foo
成员初始化程序列表中初始化obj1
ABC initABC() {
// Some computations
return ABC(A, B)
}
Foo() : obj1(initABC()) {}
选项 3:动态分配 obj1,例如使用std::unique_ptr
选项 4:使用std::optional
或模拟的 c++11 版本,如其他答案所示
您只需在派生构造函数的初始值设定项列表中调用基本构造函数。 初始化列表在构造函数参数之后以“:”开头。 见示例代码!
在初始化列表本身中调用函数没有问题。
int CallFunc1(int x) { return x*2; }
int CallFunc2(int y) { return y*4; }
class ABC {
public:
ABC(int A, int B):a{CallFunc1(A)},b{CallFunc2(B)} {
std::cout << "Constructor with " << a << " " << b << " called" << std::endl;
}
private:
int a;
int b;
};
class Foo {
public:
Foo(): obj1(1,2){}
Foo( int a, int b): obj1(a, b){}
private:
ABC obj1;
};
int main()
{
Foo foo;
Foo fooo( 9,10);
}
编辑:
对于您的情况,我能想到的最佳方法是复制构造函数,更具体地说明您需要存储的内容会很有帮助,因为如果它只是 class 动态分配中的两个整数,那么 object 的大小是构造对哪种方法最好有影响,对于更大的数据类型,复制构造函数可能会更慢,因为 object 必须创建两次:一次是在父对象构造函数中自动构造时,另一次是在创建临时 object 时必须复制这些值,如果大小较大,这可能会比动态分配更慢。
据我所知,class 中的所有对象都会在构造函数中自动初始化/分配,因此可悲的是动态 memory 使用可能是您最好的选择。
如果您对 object 初始化但为空感到满意,那么您知道它还没有“准备好”,但您可以稍后在您想要初始化它时用有用的数据填充它。 这可以通过将 object 中的内容设置为 null 值或类似值的默认构造函数来完成,因此您知道 object 尚未正确初始化。 然后在使用 object 之前,您可以通过检查 null 值或通过在 object 中放置一个告诉您它是否已初始化的布尔值来检查它是否已初始化。 在我看来,动态分配仍然会更好,并使代码看起来更干净,因为您需要存储的只是 null 指针,直到需要 object 然后分配并设置为指针。 也很容易检查指针是否等于 nullptr 以了解 object 的 state。
动态分配 memory 可能很麻烦,因为您必须确保摆脱 memory 泄漏,并且比使用堆栈稍慢,但是对于 Z6CE809EACF90BA125B40FA4BD90396堆栈上可用的几兆字节数据,所以如果你这样做只是为了避免麻烦,我建议正确学习它。 如果您能更具体地了解您想要使用哪种 object 或者您只是想要一个适用于大多数情况的答案,那就太好了。 例如:
*ABC obj1 = nullptr;
...object is needed
obj1 = new(ABC(constructor stuff));
...obj1 isn't needed
delete obj1;
或 c++ 在程序关闭时自动删除它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.