显式初始化没有默认构造函数的成员

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成员变量.那可能不是你想要的.有些编译器允许您打开警告.


650*_*502 5

有两个错误

  1. 您的代码MyOtherClass myObject(60);没有初始化类的成员,而是声明了一个名为的局部变量myObject,该变量将在构造函数中隐藏该成员。要初始化没有默认构造函数的成员对象,您应该改用成员初始化列表。

  2. 您正在尝试通过尝试编译器来学习 C++。

第二个错误是最严重的错误,如果不纠正,将带你走上一条非常痛苦的道路;学习 C++ 的唯一方法是获得一两本好书,然后从头到尾阅读它们。用 C++ 试验效果不佳。

无论你多么聪明,你都无法用 C++ 正确猜测,从某种意义上说,聪明甚至是危险的(因为你可能会想跳过一些“你已经理解”的东西):原因是它发生在相当一些地方认为正确的 C++ 方式是不合逻辑的,并且是语言历史演变的结果。

在很多地方,C++ 之所以如此,是因为历史,而不是因为它有意义,无论你多么聪明,都无法推断出历史……历史必须研究。

  • 我没有否决你的答案,但我怀疑有些人是抱着“去读书”的情绪来阅读它的。虽然这并不完全错误,但我看到有人会感到被拒绝。无论如何,关于 C++ 在很大程度上不合逻辑的部分,这使得在学习该语言时必须对规范细节进行枯燥的研究,这确实是事实。 (3认同)