C ++:类构造函数:variable_name''必须初始化

时间:2017-03-20 22:17:24

标签: c++ class

我试图在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;必须初始化

4 个答案:

答案 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成员变量。