我知道这个问题很多,但我来自Java,而且我很长时间没有做过任何C / C ++。
您能否提醒我如何在C ++中将对象正确传递给另一个对象的构造函数?
例如,我需要将一个新的Light对象传递给Button构造函数:
// LED Light
class Light {
int pin;
public:
Light(int p) {
pin = p;
}
};
// BUTTON
class Button {
Light ledLight;
public:
Button(Light l) {
ledLight = l;
}
};
Light my_led(0);
Button my_button(my_led);
这就是我在类似Java的方面做的事情。 但是,这会产生以下错误:
:: In constructor ‘Button::Button(Light)’:
:: 16:19: error: no matching function for call to ‘Light::Light()’
:: 16:19: note: candidates are:
:: 6:3: note: Light::Light(int)
:: 6:3: note: candidate expects 1 argument, 0 provided
:: 2:7: note: Light::Light(const Light&)
:: 2:7: note: candidate expects 1 argument, 0 provided
对象是通过引用传递还是在创建新Button时是否尝试创建新对象?
或者我是否需要将Light声明为Button的构造函数中的指针?
任何帮助都是非常苛刻的!
答案 0 :(得分:7)
程序尝试使用默认构造函数启动 RequestParams params = new RequestParams();
for ( String element: elements) {
params.add("elements[]", element);
}
AsyncHttpClient client = new AsyncHttpClient();
client.post(context, "https://aaaaa.php", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
try {
//mycode
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
,然后将ledLight
分配给l
。编译器会给出错误,因为ledLight
没有默认构造函数。试试这个:
Light
答案 1 :(得分:2)
您缺少默认构造函数。尝试修改你的课程:
class Light {
int pin;
public:
Light()=default; //<-- put this in
Light(int p) {
pin = p;
}
};
至于为什么你没有自动生成默认构造函数,这是因为你已经声明了某种类型的构造函数,因此编译器不会生成默认构造函数(来自http://en.cppreference.com/w/cpp/language/default_constructor,请参阅有关隐式声明/定义的构造函数)。
回应评论:
它不会尝试调用默认构造函数而不是默认构造函数 传递参数?
执行代码到达最后一行时:
Button my_button(my_led);
您在Button
实例化过程中实例化Light
和Button
。如果没有指定默认的Light::Light()
构造函数,那么您将省略如何在没有值的情况下实例化Light
对象的说明,在将my_led
的值复制到my_button之前,您需要执行此操作。你会得到你想要的结果,你现在只是向编译器发出关于如何执行中间步骤的指令,即在没有任何参数的情况下实例化Light
。
要考虑的一些事情:
你真正尝试做什么?只需查看您的指令代码:
Light my_led(0);
Button my_button(my_led);
在我看来,你似乎试图说“名为my_led
的灯存在”,“名为my_button
的按钮存在且需要my_led
”。您是希望按钮引用已存在的特定LED,还是只是具有相同值的LED?
如果您认为您想要参考该按钮的实际LED,那么您可能需要考虑执行以下操作:
class Button {
const Light *ledLight;
public:
Button(const Light& l) :
ledLight{&l}
{}
};
这样,您的Button
会指向您创建的Light
指针,而您对Light
代码中的Button
所做的任何操作都将在Light
代码中执行您已经实例化的{1}}对象,而不是您使用当前Light
构造函数通过复制Light
创建的Button
的单独副本。
如果您希望按钮实际修改灯光,请按以下方式修改Button
:
class Button {
// constant reference to changeable object
Light * const ledLight;
public:
/**
* You're providing a reference to a light that can be changed
* (i.e. button code can toggle lit status or something)
*/
Button(Light & l) :
ledLight{&l}
{}
};
上面你可以想到从按钮到LED有一条不变的电线。如果您认为您将重新分配从按钮点亮的LED,您也可以从const
中的指针成员中取出Button
关键字。