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

时间:2015-07-18 07:08:30

标签: c++ parameters constructor

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

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

摘录:

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

4 个答案:

答案 0 :(得分:21)

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

if ($_GET['result']):
$rslt = $_GET['result'];
$result = Unirest\Request::get("https://sphirelabs-mobile-number-portability-india-operator-v1.p.mashape.com/index.php?number=$rslt",
array(
"X-Mashape-Key" => "XXXXXXXXXXXXX",
"Accept" => "application/json"
)
);

echo ($result->body->Operator);
echo($result->body->{'Telecom circle'});
endif;  

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

答案 1 :(得分:10)

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

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

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

注意这一行:

MyOtherClass myObject (60);
构造函数中的

实际上是在创建一个隐藏myObject成员变量的局部变量。那可能不是你想要的。有些编译器允许你打开警告。

答案 2 :(得分:2)

有两个错误

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

  2. 您正在尝试通过试验编译器来学习C ++。这是最严重的错误,因为它将是一条非常痛苦的道路。学习C ++的唯一方法是获取one or two good books并阅读它们的封面。无论你多么聪明,你都无法用C ++正确猜测,从某种意义上说,聪明是危险的,因为它发生在很多地方,正确的答案是不合逻辑的,也是语言历史演变的结果。无论你多么聪明,你都无法推断出历史......必须研究历史。

答案 3 :(得分:0)

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

   myObject.doSomething();

}

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