我试图实例化一个没有默认构造函数的对象,因此可以从类中的任何方法引用它。我在头文件中声明了它,但编译器说创建它的类的构造函数必须显式初始化成员,我不知道如何做到这一点。
非常感谢您的回答,提前谢谢!
摘录:
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;
}
答案 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)
有两个错误
您的代码MyOtherClass myObject(60);
未初始化该类的成员,而是声明一个名为myObject
的局部变量,该变量将隐藏构造函数内的成员。要初始化没有默认构造函数的成员对象,您应该使用成员初始化列表。
您正在尝试通过试验编译器来学习C ++。这是最严重的错误,因为它将是一条非常痛苦的道路。学习C ++的唯一方法是获取one or two good books并阅读它们的封面。无论你多么聪明,你都无法用C ++正确猜测,从某种意义上说,聪明是危险的,因为它发生在很多地方,正确的答案是不合逻辑的,也是语言历史演变的结果。无论你多么聪明,你都无法推断出历史......必须研究历史。
答案 3 :(得分:0)
MyClass::MyClass(): myObject (60){
myObject.doSomething();
}
数据成员的初始化在构造函数body.in你刚刚分配的函数体之前结束