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

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你刚刚赋值的函数体

有两个错误

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

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

第二个错误是最严重的错误,如果不加以纠正,将会把你带到一条非常痛苦的道路上;学习 C++ 的唯一方法是获得 one or two good books 并从头到尾阅读它们。尝试使用 C++ 效果不佳。

无论你多么聪明,你都不可能用 C++ 猜对,而且在某种意义上,聪明甚至是危险的(因为你可能会想跳过某些东西 "you understood already"):原因是在很多地方,正确的 C++ 方式是不合逻辑的,是语言历史演变的结果。

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