我知道这个问题经常被问到,但是我来自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时尝试创建新的对象?
还是我需要在Button的构造函数中将Light声明为指针?
任何帮助都非常感谢!
您缺少默认的构造函数。尝试像这样修改您的课程:
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);
您正在实例化aButton
和aLight
作为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
已实例化的对象上执行,而不是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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句