std::vector<Bar> 作为类 Foo 中的成员变量需要一个空的构造函数
std::vector<Bar> as a member variable in class Foo needs an empty constructor for Bar
情况如下:
我有一个由以下文件定义的类。
Foo.h文件
template<typename MyType>
class Foo
{
public:
Foo(int number = 50);
private:
typedef enum {VAR1, VAR2} Type;
class Bar
{
MyType a;
Type b;
Bar(int param1, Type param2) : a(param1), b(param2) {}
}
std::vector<Bar> vec;
};
Foo.cpp文件:
template<typename MyType>
Foo::Foo(int number) : vec(number)
{ }
问题是当我编译这个时,我在.cpp文件的第一行得到一个错误,说它需要一个没有参数的Bar构造函数。我猜它需要它来创建Foo中的向量。我为Bar添加了一个没有参数的构造函数,给出了以下.h文件:
template<typename MyType>
class Foo
{
public:
Foo(int number = 50);
private:
typedef enum {VAR1, VAR2} Type;
class Bar
{
MyType a;
Type b;
Bar() {} // <---- Line added
Bar(int param1, Type param2) : a(param1), b(param2) {}
}
std::vector<Bar> vec;
};
现在我可以编译并且它可以工作,但是在我刚刚添加的行中有一个警告说Member 'b' was no initialized in this constructor
。enum有问题吗?
我不明白我该怎么做才能让它在没有这个警告的情况下工作。
Edit:我收到一些回答说要在空构造函数中添加初始化列表。然而,我的类实际上是一个模板类,a
对我来说是一个未知的类型,所以我不能初始化它,因为我不知道它的类型。我尝试在Bar的初始化列表中只初始化b
,它起作用了。警告消失了,但是可以让a
未初始化吗?是否有一种方法可以删除没有Bar参数的构造函数,并且仍然在Foo的构造函数中给向量一个大小?
问题在于Foo::Foo(int)
定义中的初始化器列表。你写
Foo::Foo(int n)
: vec(n) { }
。你正在使用构造函数
std::vector<Bar>::vector(size_t number, const Bar &x = Bar())
请注意x = Bar()
,这意味着你用Bar
的标准构造实例填充向量。由于Bar
中至少定义了一个构造函数,编译器不会自动提供标准构造函数。
在Bar
中定义一个标准构造函数,就像其他答案建议的那样,或者在Foo
的构造函数中添加其他内容,例如
Foo::Foo(int n)
: vec(n, Bar(1, VAR1)) { }
,编译错误消失。
对编辑的回答:您收到的警告可能意味着:成员a
没有正确初始化。由于它是int
,这可能是可以的(c++不会强制您初始化int
s),但要注意稍后程序中成员a
中的奇怪和任意值。更好的解决方案是在构建时将其设置为定义良好的状态,这意味着"此值是未知的"。
Edit:我删除了我写的所有关于异构容器的东西。但是,如果你需要这些东西,可以看看我的帖子的编辑历史。
你可以在Bar
的标准构造函数中初始化a
,像这样:
Bar::Bar() : a(MyType()), b(UNKNOWN) { }
,并将UNKNOWN
添加到枚举Type
。这里假设类型MyType
是标准可构造的。例如,这适用于所有基本类型,如int
、double
等。这为您提供了Bar
对象的一个定义良好的状态,这可能意味着未知。可以通过比较b
和UNKNOWN
来测试。
正如yakk在他的评论中所说:像枚举这样的基本类型可以保持初始化,但在你的情况下,编译器警告你:可能是你的成员b
包含一个值,而VAR1
或VAR2
根本没有标签。用定义良好的值初始化所有成员总是一个好主意,除非你真的被迫不这样做——例如,如果执行是非常重要的。
您需要在空构造函数中添加一个初始化列表(并且可能将其设为public)。
class Bar
{
int a;
Type b;
Bar() : a(0), b(VAR1) {} // initialize the members to default values.
Bar(int param1, Type param2) : a(param1), b(param2) {}
}
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- 有一个构造函数,但有两个析构函数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- C 如何仅实现多个继承类的一个构造函数
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效
- 创建一个构造函数,即Capabe获取任何数量的参数
- 我如何在类上需要另一个构造函数的对象中声明一个对象
- 使用委托调用构造函数和在另一个构造函数体中调用的区别
- 为什么当我尝试编译时,我的 c++ 代码不断返回对我的一个构造函数的"未定义的引用"?
- C :另一个构造函数的构造函数的隐式调用
- 如何创建一个构造函数,该构造函数吸收char阵列
- 为什么有一个构造函数同时接受initializer_list和一个参数包
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 如何在一个构造函数中使用两个可变参数模板参数来绑定两个函数
- 从同一类的另一个构造函数调用构造函数
- 将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递实例所拥有的列表中