C 如何使用隐藏的默认构造函数初始化成员
C++ How to initialize members with hidden default constructors?
我有一个带有隐藏默认构造函数的类,可以强制使用构造函数采用参数。另一个类是使用两个类的实例:
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)
构建foo1
和foo2
成员。
Bar(void) {}
这是一个问题:它尝试使用Foo
的默认构造函数来构建foo1
和foo2
成员。由于该构造函数不是可访问的(这是正确的术语;它不是隐藏),因此您会遇到错误。至少有三个解决方案:
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) { ... }
};
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏