B班有A班成员m_a
class A{
A(...);
~A();
init(...);
...//other methods;
...//data
}
为了用某个值初始化m_a,我可以使用构造函数或init()函数。
如果我使用构造函数,并且无法在B类构造函数中决定该值,那么我将不得不使用A* m_a
和new A(...)
进行初始化。
或者如果我使用init()函数,我可以使用A a
作为B类的成员。
那么在这种情况下init()函数是一种更好的方法吗?
答案 0 :(得分:2)
你应该更喜欢在构造函数或内联中直接初始化所有成员(直接在你声明它们的地方),除非你有好的理由不这样做。
如果您使用init
- 样式函数,则可以使用尚未初始化的对象。
我建议在不知道m_a
应该具有什么值的情况下实例化B对象是不可能的。为此,您应该使用B
的构造函数来获取A
参数:
class B {
public:
explicit B(A a)
: m_a(std::move(a))
{ }
private:
A m_a;
};
这样,在不知道应该使用B
进行初始化的情况下创建m_a
对象是不可能的:
B b; // error
B
的用户被迫提供B::m_a
的值,因此无法使用未初始化的B
对象:
B b(A());
如果您想知道std::move
是什么,它允许将a
参数移动到m_a
成员而不复制,这更快。要阅读更多相关信息,请搜索" C ++移动语义"。但是,这是可选的,并不是上述示例所必需的。
答案 1 :(得分:0)
我不确定我理解你的pb,但最终我会选择构造函数。
struct A{
A(int a = 0):a_(a);{}
a_:
}
struct B{
B(int b = 0):A_(b);{}
A_ get_A(){ return A_;}
A A_
}
如果您需要更新init的函数,我将创建一个自由函数
void foo(A& a){
//whatever
}
然后B返回A_并使用foo
的方法B b;
foo(b.get_A());
这是一种可能的方法。请记住C ++构造函数初始值,并且至少给出默认值0.我的2美分,希望它有所帮助
添
答案 2 :(得分:0)
如果您有多个构造函数都需要相同的初始化代码,那么将该代码放在init
函数中可以在修改类时减少冗余和错误。否则,构造函数本身就更有意义了。
某些构造无法在构造函数的初始化列表之外进行初始化,例如const
或引用成员。对于那些你将别无选择,除了在每个构造函数中初始化它们。