我试图在c ++中创建一个名为MyClass
的类。但是我在MyClass
的cpp文件中收到了一条错误消息。更具体的是在类的构造函数中。我已经创建了一个单独的类OtherClass
,但该代码有效。对于某些参数,OtherClass
用作MyClass
中的数据类型。
以下是MyClass
的代码:
// MyClass.h
#ifndef "MyClass_h"
#define "MyClass_h"
#include 'OhterClass.h"
#include <vector>
#include <string>
using namespace std;
class MyClass {
public:
MyClass (vector<OtherClass>, vector<string>, OtherClass);
// more code
private:
vector<OtherClass> variable_A;
vector<string> variable_B;
OtherClass variable_C;
};
这是MyClass.cpp中的构造函数,我收到错误消息:
#include "MyClass.h"
MyClass::MyClass(vector<OtherClass> _variable_A, vector<string> _variable_B, OtherClass _variable_C){
variable_A = _variable_A;
variable_B = _variable_B;
variable_C = _variable_C;
}
字段&#39; variable_C&#39;必须初始化
答案 0 :(得分:1)
OtherClass
可能没有定义默认构造函数。在构造MyClass
时,编译器必须知道如何构造其所有成员,包括variable_C
。使用构造函数初始化列表(或至少为此)
MyClass::MyClass(vector<OtherClass> _variable_A, vector<string> _variable_B, OtherClass _variable_C)
: variable_C(_variable_C)
{
variable_A = _variable_A;
variable_B = _variable_B;
// variable_C = _variable_C;
}
BTW:您应该将这些参数作为参考传递(理想情况下为const&
)。
答案 1 :(得分:1)
该错误表明OtherClass
没有默认构造函数。 MyClass
字段的初始化发生在输入MyClass
构造函数的主体之前。在您的示例中,MyClass
需要能够默认构造其每个字段,然后才能为其分配任何新值。您正在构造函数体中进行赋值,而不是初始化。
执行单独的构造和分配并不理想。你真的应该使用构造函数的member initialization list来代替。
此外,您应该通过const引用而不是值传递输入值(尤其是std::vector
对象),以避免分配不必要的临时值。
请改为尝试:
#ifndef MyClass_h
#define MyClass_h
#include "OtherClass.h"
#include <vector>
#include <string>
using namespace std;
class MyClass {
public:
MyClass (const vector<OtherClass> &, const vector<string> &, const OtherClass &);
// more code
private:
vector<OtherClass> variable_A;
vector<string> variable_B;
OtherClass variable_C;
};
#endif
#include "MyClass.h"
MyClass::MyClass(const vector<OtherClass> &_variable_A, const vector<string> &_variable_B, const OtherClass &_variable_C)
: variable_A(_variable_A), variable_B(_variable_B), variable_C(_variable_C)
{
}
答案 2 :(得分:0)
在构造函数中,您没有初始化。
只是赋值,初始化过程发生在构造函数中的赋值操作之前。
改为使用初始化列表。
In&#34;有效的C ++&#34;斯科特清楚地说明了这一点......请参考。 (某些地方(第1章第4项)
答案 3 :(得分:0)
看起来您的Otherclass具有参数化的构造函数。使用初始化列表初始化Otherclass成员变量。