C 如何使用隐藏的默认构造函数初始化成员

C++ How to initialize members with hidden default constructors?

本文关键字:构造函数 初始化 成员 默认 何使用 隐藏      更新时间:2023-10-16

我有一个带有隐藏默认构造函数的类,可以强制使用构造函数采用参数。另一个类是使用两个类的实例:

typedef struct { ... } BAZ;
class Foo {
  private:
    Foo(void) {}
  public:
    Foo(BAZ a) { ... }
};
class Bar {
  private:
    Foo foo1;
    Foo foo2;
    Bar(void) {}
  public:
    Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }
};

最明显的是,变量foo1和foo2的声明将调用默认的foo构造函数,但是由于它是私有的,因此不能并且会出现编译器错误。

是否有一种方法可以防止其尝试默认的foo构造函数,而只是等待bar构造函数初始化它们?

我想避免使用 new 关键字(这将解决整个问题)。

编辑:
似乎人们很难理解问题和困境。我将尝试解释:

我想强制使用foo(baz)构造函数,这意味着任何尝试使用foo(void)构造函数的尝试都会产生错误。

隐藏默认构造函数,它被声明为私人成员。如果有人尝试使用默认的constructor foo(),它将出现故意错误。

不声明默认构造函数,并且仅声明foo(BAZ)并不阻止编译器创建公共默认构造函数。如果我将其声明foo(),则不会出现错误。到目前为止,它可以正常运行,并且按预期效果。

第二类栏具有两个FOO实例,但是当Instance Inthand Bar时,将使用默认(隐藏)构造函数调用这些FOO成员并生成错误。然后,在栏构造器中,这两个实例将使用正确的公共构造栏(BAZ A,BAZ B)初始化:Foo1(a),Foo2(b)。这就是我想要的。

有没有办法在初始化栏时防止其调用foo默认构造函数,以便栏构造函数可以使用正确的foo构造函数?

new 解决方案有效,因为默认构造函数从未被调用:

BAZ a = {...}
Foo *foo1 = new Foo(a);

我希望这使它更加清楚。

edit2:已解决该错误不是在隐藏的foo构造函数中,它是隐藏的bar构造函数,试图使用隐藏的默认foo构造函数。

Bar(void) : Foo(BAZ{}), Foo(BAZ{}) {}

解决了。

edit3:
真正的问题似乎是在开发工具中。重新启动并手动清除缓存后,它作为C 14标准的工作。

变量的声明foo1和foo2将调用默认值 foo构造函数

否。声明这些成员变量说它们是成员。关于如何构建它们,它没有说什么。那就是使用它们的类的构造函数的工作。

Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }

到目前为止罚款:此构造函数使用构造函数Foo(Baz)构建foo1foo2成员。

Bar(void) {}

这是一个问题:它尝试使用Foo的默认构造函数来构建foo1foo2成员。由于该构造函数不是可访问的(这是正确的术语;它不是隐藏),因此您会遇到错误。至少有三个解决方案:

1:

Bar() : foo1(Baz()), foo2(Baz()) {}

这使用了服用Baz的构造函数。

2:

Bar() = delete;

这使得不存在Bar的默认构造函数,因此它不会尝试使用Foo的默认构造函数。

3:

只是不这样做。如果您不编写默认构造函数,但确实编写另一个构造函数,则编译器不会生成默认的构造函数。

不要隐藏构造函数。不要首先声明它们。

typedef struct { ... } BAZ;
class Foo {
  public:
    Foo(BAZ a) { ... }
};
class Bar {
  private:
    Foo foo1;
    Foo foo2;
  public:
    Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }
};