【问题标题】:Explicitly initialize member which does not have a default constructor显式初始化没有默认构造函数的成员
【发布时间】:2015-10-07 22:31:03
【问题描述】:

我正在尝试实例化一个没有默认构造函数的对象,以便可以从类中的任何方法引用它。我在头文件中声明了它,但编译器说创建它的类的构造函数必须显式初始化成员,我不知道该怎么做。

非常感谢您的回答,提前谢谢您!

sn-p:

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;
}

【问题讨论】:

  • 可以创建一个指针,在初始化的地方动态分配。
  • 如果您可以在初始化列表中进行初始化,那是您最好的选择,请参阅this question。所以应该是MyClass::MyClass() : myObject(60) { }
  • 初始化列表成功了,非常感谢!!!
  • 我不明白这个没有默认构造函数的对象,因此可以从类内的任何方法中引用它。你能在这里解释一下你的逻辑吗? AFAIK,任何成员都可以被任何其他成员引用,无论其结构如何。

标签: c++ parameters constructor


【解决方案1】:

你快到了。当您在 C++ 中创建对象时,默认情况下它会在其所有对象上运行默认构造函数。你可以通过这个告诉语言使用哪个构造函数:

MyClass::MyClass() : myObject(60){

    myObject.doSomething();

}

这样它就不会尝试找到默认构造函数并调用你想要的那个。

【讨论】:

    【解决方案2】:

    需要在构造函数初始化列表中初始化myObject成员:

    MyClass::MyClass() : myObject(60) {
       myObject.doSomething();
    }
    

    在你进入构造函数的主体之前,所有的成员变量都必须被初始化。如果您未在构造函数初始化列表中指定成员,则将默认构造成员。由于MyOtherClass 没有编译器放弃的默认构造函数。

    注意这一行:

    MyOtherClass myObject (60);
    

    在您的构造函数中实际上是在创建一个局部变量,它隐藏了您的 myObject 成员变量。这可能不是你想要的。一些编译器允许您为此打开警告。

    【讨论】:

    • 这个答案比选择的答案有更多的解释。点赞
    【解决方案3】:
    MyClass::MyClass(): myObject (60){
    
       myObject.doSomething();
    
    }
    

    数据成员的初始化在构造函数体之前结束。在你刚刚分配的函数体中

    【讨论】:

      【解决方案4】:

      有两个错误

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

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

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

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

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

      【讨论】:

      • 我对否决票真的很好奇,任何关于为什么这是一个错误答案的评论都会有所帮助。
      • 我没有否决你的答案,但我怀疑有些人是抱着“去读一本书”的心情读它的。虽然这并不完全错误,但我看到有人会感到被拒绝。无论如何,关于 C++ 在很大程度上是不合逻辑的部分,这使得在学习语言时必须对规范细节进行枯燥的研究,这是可悲的事实。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2012-01-28
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多