我有一个 FRED 类,它将两个实例的引用作为其构造函数的输入 班尼班:
class FRED{
private:
BARNEY &barney_inst1;
BARNEY &barney_inst2;
public:
FRED(BARNEY &a, BARNEY &b):
barney_inst1(a), barney_inst2(b) {
}
我有一个名为 WILMA 的父类,其中包含一个 FRED 实例作为成员 和 BARNEY 类的两个实例:
class WILMA {
private:
BARNEY foo[2];
FRED bar;
WILMA(uint8_t *p) :
{
for(uint8_t i=0;i<2;i++)
{
foo[i]=BARNEY(p[i]);
}
bar= FRED(foo[0],foo[1]); //This always fails at compile
}
}
我的问题是这永远不会编译,因为 FRED 没有“空白”构造函数。
如何解决 FRED 的定义并仍将其包含为 WILMA 的成员?我可以将 FRED 和 BARNEY 的实例声明为全局的,这样就可以了,但是如果我可以将全局变量放在父类中,我不喜欢使用全局变量。这对于将来的代码更改来说很混乱且困难。
我尝试添加一个空白构造函数,发现这永远不会起作用,因为引用的输入(&a 和 &b)不能保持未初始化状态,一旦初始化它们,它们就无法更改。相信我,我已经尝试过了。编译器似乎总是以某种方式阻碍我。
我尝试将 bar (FRED 的实例)声明为指针并使用:
FRED *bar;
...
bar=new FRED(foo[0],foo[1])
它可以编译,但在执行期间由于某种原因而挂起,我认为这与具有指向带有引用输入的类的指针有关。
如果您有参考文献,那么您必须遵守参考文献规则:以后无法更改它们。
您可以在 WILMA 构造函数中初始化它们:
WILMA(uint8_t *p) : bar(foo[0], foo[1]) { ... }
或者,让它成为其他东西,比如指针。
FRED *bar;
...
bar=new FRED(foo[0],foo[1])
我建议将其制作为
std::unique_ptr<FRED>
而不是原始的。帮助清理。