在父类构造函数中使用引用的输入初始化成员类

问题描述 投票:0回答:1

我有一个 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])

它可以编译,但在执行期间由于某种原因而挂起,我认为这与具有指向带有引用输入的类的指针有关。

c++ class constructor pass-by-reference
1个回答
0
投票

如果您有参考文献,那么您必须遵守参考文献规则:以后无法更改它们。

您可以在 WILMA 构造函数中初始化它们:

WILMA(uint8_t *p) : bar(foo[0], foo[1]) { ... }

或者,让它成为其他东西,比如指针。

FRED *bar;
  ...
bar=new FRED(foo[0],foo[1])

我建议将其制作为

std::unique_ptr<FRED>
而不是原始的。帮助清理。

© www.soinside.com 2019 - 2024. All rights reserved.