我正在尝试创建一个需要首先初始化成员变量的类。我知道为什么会发生这种情况,但有没有办法解决这个问题?
当前打印顺序: 第二 先
想要的打印订单: 第一的 第二个
#include <iostream>
struct A {
A() {
std::cout << "first" << '\n';
}
};
struct B {
B() {
std::cout << "second" << '\n';
}
};
struct C : public B {
C() : a(), B() {
}
A a;
};
int main() {
C c;
return 0;
}
答案 0 :(得分:6)
将需要首先初始化的成员粘贴到结构中,并在 B
之前从该结构中私下继承。
struct A {
A() { std::cout << "first" << '\n'; }
};
struct B {
B() { std::cout << "second" << '\n'; }
};
struct Members { A a; };
struct C : private Members, public B {
C() : Members(), B() {}
};
int main() {
C c;
}
这样做的缺点是无法避免将“成员结构”暴露给外界,但这在实践中应该不成问题。
答案 1 :(得分:4)
在 C++ 中,基类将在派生类的任何成员变量之前初始化。
鉴于您提供的信息,最好的办法是选择组合而不是继承:
struct A {
A() {
std::cout << "first" << '\n';
}
};
struct B {
B() {
std::cout << "second" << '\n';
}
};
struct C {
A a;
B b;
};
这将展示desired behavior
答案 2 :(得分:-2)
使 A
成为 C
的必要参考:
#include <iostream>
struct A {
A() {
std::cout << "first" << '\n';
}
};
struct B {
B() {
std::cout << "second" << '\n';
}
};
struct C : public B {
C(const A& a) : _A(a), B() {}
const A& _A;
};
int main() {
A a;
C c(a);
return 0;
}