显式初始化没有默认构造函数的成员
Explicitly initialize member which does not have a default constructor
我正在尝试实例化一个没有默认构造函数的对象,以便可以从 class 中的任何方法引用它。我在我的头文件中声明了它,但编译器说 class 创建它的构造函数必须显式初始化该成员,我不知道该怎么做。
非常感谢您的回答,提前致谢!
片段:
MyClass.h
include "MyOtherClass.h"
class myClass {
private:
MyOtherClass myObject;
public:
MyClass();
~MyClass();
void myMethod();
}
MyClass.cpp
include "MyClass.h"
MyClass::MyClass() {
MyOtherClass myObject (60);
myObject.doSomething();
}
MyClass::myMethod() {
myObject.doSomething();
}
MyOtherClass.h
class MyOtherClass {
private:
int aNumber;
public:
MyOtherClass (int someNumber);
~MyOtherClass();
void doSomething();
}
MyOtherClass.cpp
include "MyOtherClass.h"
MyOtherClass::MyOtherClass (int someNumber) {
aNumber = someNumber;
}
void MyOtherClass::doSomething () {
std::cout << aNumber;
}
你快到了。当您在 C++ 中创建一个对象时,默认情况下它会在其所有对象上运行默认构造函数。您可以通过以下方式告诉语言使用哪个构造函数:
MyClass::MyClass() : myObject(60){
myObject.doSomething();
}
这样它就不会尝试查找默认构造函数并调用您想要的构造函数。
您需要初始化构造函数初始化列表中的myObject
成员:
MyClass::MyClass() : myObject(60) {
myObject.doSomething();
}
在进入构造函数主体之前,必须初始化所有成员变量。如果您未在构造函数初始化列表中指定成员,则成员将被默认构造。由于 MyOtherClass
没有编译器放弃的默认构造函数。
注意这一行:
MyOtherClass myObject (60);
在您的构造函数中实际上创建了一个局部变量,该变量隐藏了您的 myObject
成员变量。这可能不是您想要的。一些编译器允许您为此打开警告。
MyClass::MyClass(): myObject (60){
myObject.doSomething();
}
数据成员的初始化在构造函数之前结束body.in你刚刚赋值的函数体
有两个错误
您的代码 MyOtherClass myObject(60);
没有初始化 class 的成员,而是声明了一个名为 myObject
的局部变量,它将把成员隐藏在构造函数。要初始化没有默认构造函数的成员对象,您应该改用成员初始化列表。
您正在尝试通过编译器试验来学习 C++。
第二个错误是最严重的错误,如果不加以纠正,将会把你带到一条非常痛苦的道路上;学习 C++ 的唯一方法是获得 one or two good books 并从头到尾阅读它们。尝试使用 C++ 效果不佳。
无论你多么聪明,你都不可能用 C++ 猜对,而且在某种意义上,聪明甚至是危险的(因为你可能会想跳过某些东西 "you understood already"):原因是在很多地方,正确的 C++ 方式是不合逻辑的,是语言历史演变的结果。
在很多地方,C++ 之所以如此,是因为历史,而不是因为它有意义,无论你多么聪明,也无法推断出历史……必须研究历史。
我正在尝试实例化一个没有默认构造函数的对象,以便可以从 class 中的任何方法引用它。我在我的头文件中声明了它,但编译器说 class 创建它的构造函数必须显式初始化该成员,我不知道该怎么做。
非常感谢您的回答,提前致谢!
片段:
MyClass.h
include "MyOtherClass.h"
class myClass {
private:
MyOtherClass myObject;
public:
MyClass();
~MyClass();
void myMethod();
}
MyClass.cpp
include "MyClass.h"
MyClass::MyClass() {
MyOtherClass myObject (60);
myObject.doSomething();
}
MyClass::myMethod() {
myObject.doSomething();
}
MyOtherClass.h
class MyOtherClass {
private:
int aNumber;
public:
MyOtherClass (int someNumber);
~MyOtherClass();
void doSomething();
}
MyOtherClass.cpp
include "MyOtherClass.h"
MyOtherClass::MyOtherClass (int someNumber) {
aNumber = someNumber;
}
void MyOtherClass::doSomething () {
std::cout << aNumber;
}
你快到了。当您在 C++ 中创建一个对象时,默认情况下它会在其所有对象上运行默认构造函数。您可以通过以下方式告诉语言使用哪个构造函数:
MyClass::MyClass() : myObject(60){
myObject.doSomething();
}
这样它就不会尝试查找默认构造函数并调用您想要的构造函数。
您需要初始化构造函数初始化列表中的myObject
成员:
MyClass::MyClass() : myObject(60) {
myObject.doSomething();
}
在进入构造函数主体之前,必须初始化所有成员变量。如果您未在构造函数初始化列表中指定成员,则成员将被默认构造。由于 MyOtherClass
没有编译器放弃的默认构造函数。
注意这一行:
MyOtherClass myObject (60);
在您的构造函数中实际上创建了一个局部变量,该变量隐藏了您的 myObject
成员变量。这可能不是您想要的。一些编译器允许您为此打开警告。
MyClass::MyClass(): myObject (60){
myObject.doSomething();
}
数据成员的初始化在构造函数之前结束body.in你刚刚赋值的函数体
有两个错误
您的代码
MyOtherClass myObject(60);
没有初始化 class 的成员,而是声明了一个名为myObject
的局部变量,它将把成员隐藏在构造函数。要初始化没有默认构造函数的成员对象,您应该改用成员初始化列表。您正在尝试通过编译器试验来学习 C++。
第二个错误是最严重的错误,如果不加以纠正,将会把你带到一条非常痛苦的道路上;学习 C++ 的唯一方法是获得 one or two good books 并从头到尾阅读它们。尝试使用 C++ 效果不佳。
无论你多么聪明,你都不可能用 C++ 猜对,而且在某种意义上,聪明甚至是危险的(因为你可能会想跳过某些东西 "you understood already"):原因是在很多地方,正确的 C++ 方式是不合逻辑的,是语言历史演变的结果。
在很多地方,C++ 之所以如此,是因为历史,而不是因为它有意义,无论你多么聪明,也无法推断出历史……必须研究历史。