C ++:如何将对象传递给另一个对象构造函数?

时间:2015-08-01 14:45:30

标签: c++ constructor pass-by-reference

我知道这个问题很多,但我来自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的构造函数中的指针?

任何帮助都是非常苛刻的!

2 个答案:

答案 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实例化过程中实例化LightButton。如果没有指定默认的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关键字。