C++;:类构造函数:变量名称'';必须初始化 我试图用C++编写一个叫做 MyClass < /C>的类。但是,我在我的MyClass的cpp文件中收到了一条错误消息。在类的构造函数中更具体。我已经创建了一个单独的类OtherClass,但该代码可以工作OtherClass在MyClass中用作某些参数的数据类型

C++;:类构造函数:变量名称'';必须初始化 我试图用C++编写一个叫做 MyClass < /C>的类。但是,我在我的MyClass的cpp文件中收到了一条错误消息。在类的构造函数中更具体。我已经创建了一个单独的类OtherClass,但该代码可以工作OtherClass在MyClass中用作某些参数的数据类型,c++,class,C++,Class,以下是MyClass的h代码: // 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>,

以下是MyClass的h代码:

// 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.h
#ifndef“MyClass_h”
#定义“MyClass_h”
#包括“OhterClass.h”
#包括
#包括
使用名称空间std;
类MyClass{
公众:
MyClass(向量、向量、其他类);
//更多代码
私人:
向量变量_A;
向量变量_B;
其他类变量_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;
}
#包括“MyClass.h”
MyClass::MyClass(向量变量A、向量变量B、其他类变量C){
变量_A=_变量_A;
变量_B=_变量_B;
变量C=_变量C;
}
必须初始化字段“variable_C”


OtherClass
可能没有定义默认构造函数。在构造
MyClass
时,编译器必须知道如何构造其所有成员,包括
变量\u C
。为此(或至少为此)使用构造函数初始值设定项列表

MyClass::MyClass(向量变量A、向量变量B、其他类变量C)
:variable_C(_variable_C)
{
变量_A=_变量_A;
变量_B=_变量_B;
//变量C=_变量C;
}

顺便说一句:您应该将这些参数作为引用传递(理想情况下为
const&
).

该错误表明
OtherClass
没有默认构造函数
MyClass
字段的初始化发生在
MyClass
构造函数主体输入之前。在您的示例中,
MyClass
需要能够默认构造其每个字段在此之前,它可以为它们分配任何新值。您正在构造函数体中执行赋值,而不是初始化

执行单独的构造和赋值并不理想。您确实应该使用构造函数的

此外,您应该通过常量引用而不是通过值来传递输入值(尤其是
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
\ifndef MyClass\u h
#定义MyClass_h
#包括“OtherClass.h”
#包括
#包括
使用名称空间std;
类MyClass{
公众:
MyClass(常量向量&,常量向量&,常量其他类&);
//更多代码
私人:
向量变量_A;
向量变量_B;
其他类变量_C;
};
#恩迪夫

#包括“MyClass.h”
MyClass::MyClass(常量向量和变量A、常量向量和变量B、常量其他类和变量C)
:变量A(_variable_A)、变量B(_variable_B)、变量C(_variable_C)
{
}

在构造函数中,您没有初始化

它只是赋值,初始化过程发生在构造函数中赋值操作之前

改用初始值设定项列表


在“有效的C++”一文中,斯科特清楚地谈到了这一点。请参考。(第1章第4项中的一些内容)

看起来您的Otherclass正在使用参数化构造函数。使用初始化列表初始化Otherclass成员变量。

发布所有代码。这显然不是您真正的代码-1@T.C.是的,我当然这么做了,因为这对你们来说更容易阅读和理解:)你们是说“被额外的错误弄得千疮百孔,以至于人们无法分辨“什么是什么”?您能用示例和代码进一步解释您的代码吗?
#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)
{
}