在C ++中,如果我想拥有一个没有默认构造函数的类的成员,我需要像这样显式初始化它:
class a
{
a(int)
{
}
};
class b
{
a x;
b() : x(3)
{
}
};
然而,有时候,例如x的初始化可能不那么简单。它可能是一个非常复杂的公式或整个算法函数,需要计算fors和ifs。我通常会这样解决:
class b
{
a * x;
b()
{
// Do some very complicated computations
this->x = new a(result_of_complicated_computations);
}
};
然而,这迫使我在破坏时删除指针,它的性能稍差,并使我的代码显得凌乱而丑陋。我真的很惊讶,没有办法在类的构造函数中为成员的构造函数计算参数,而不必使用这种技巧。
对此有更优雅的解决方案吗?
答案 0 :(得分:4)
使用帮助函数:
class b
{
a x;
b() : x(complicated_computation()) { }
private:
static int complicated_computation() {
return result_of_complicated_computations;
}
};
并且默认构造函数未被删除,但未声明。
答案 1 :(得分:0)
在函数中进行计算:
static a complicated_computations();
b() : x(complicated_computations()) {}
答案 2 :(得分:0)
我不明白。如果你有:
class A
{
private:
//a lot of members
public:
A(/* complex object used for construction */)
: //initialize members
{ }
}
您可以这样做:
class B
{
private:
A a;
public:
B()
: a(call_to_function_that_generates_this_complex_data())
{ }
};
您甚至可以在施工期间使用您的会员功能。但请注意:
§12.6.2.13:
会员功能(包括虚拟会员功能, 10.3)可以为正在构造的对象调用。(...)但是,如果这些操作是在ctor-initializer(或函数)中执行的 在所有之前直接或间接地从ctor-initializer调用 基类的mem-initializers已经完成,结果是 操作未定义。