Tom*_*des 23 c++ parameters constructor
我试图实例化一个没有默认构造函数的对象,因此可以从类中的任何方法引用它.我在头文件中声明了它,但编译器说创建它的类的构造函数必须显式初始化成员,我不知道如何做到这一点.
非常感谢您的回答,谢谢您提前!
片段:
MyClass.h
include "MyOtherClass.h"
class myClass {
private:
MyOtherClass myObject;
public:
MyClass();
~MyClass();
void myMethod();
}
Run Code Online (Sandbox Code Playgroud)
MyClass.cpp
include "MyClass.h"
MyClass::MyClass() {
MyOtherClass myObject (60);
myObject.doSomething();
}
MyClass::myMethod() {
myObject.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
MyOtherClass.h
class MyOtherClass {
private:
int aNumber;
public:
MyOtherClass (int someNumber);
~MyOtherClass();
void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
MyOtherClass.cpp
include "MyOtherClass.h"
MyOtherClass::MyOtherClass (int someNumber) {
aNumber = someNumber;
}
void MyOtherClass::doSomething () {
std::cout << aNumber;
}
Run Code Online (Sandbox Code Playgroud)
Rus*_*ene 24
你快到了.在c ++中创建对象时,默认情况下它会在所有对象上运行默认构造函数.您可以通过以下方式告诉语言使用哪种构造函数:
MyClass::MyClass() : myObject(60){
myObject.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这样它就不会尝试找到默认构造函数并调用您想要的构造函数.
Chr*_*rew 11
您需要myObject在构造函数初始化列表中初始化该成员:
MyClass::MyClass() : myObject(60) {
myObject.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
在输入构造函数的主体之前,必须初始化所有成员变量.如果未在构造函数初始化列表中指定成员,则将默认构造成员.由于MyOtherClass没有默认构造函数,编译器放弃了.
注意这一行:
MyOtherClass myObject (60);
Run Code Online (Sandbox Code Playgroud)
在您的构造函数中实际创建一个局部变量,该变量隐藏您的myObject成员变量.那可能不是你想要的.有些编译器允许您打开警告.
有两个错误
您的代码MyOtherClass myObject(60);没有初始化类的成员,而是声明了一个名为的局部变量myObject,该变量将在构造函数中隐藏该成员。要初始化没有默认构造函数的成员对象,您应该改用成员初始化列表。
您正在尝试通过尝试编译器来学习 C++。
第二个错误是最严重的错误,如果不纠正,将带你走上一条非常痛苦的道路;学习 C++ 的唯一方法是获得一两本好书,然后从头到尾阅读它们。用 C++ 试验效果不佳。
无论你多么聪明,你都无法用 C++ 正确猜测,从某种意义上说,聪明甚至是危险的(因为你可能会想跳过一些“你已经理解”的东西):原因是它发生在相当一些地方认为正确的 C++ 方式是不合逻辑的,并且是语言历史演变的结果。
在很多地方,C++ 之所以如此,是因为历史,而不是因为它有意义,无论你多么聪明,都无法推断出历史……历史必须研究。
| 归档时间: |
|
| 查看次数: |
25983 次 |
| 最近记录: |