C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数



传递对象引用,因为参数给了我错误:
No matching function for a call to i2cController::i2cController

我还尝试通过一个指针,并使用新的i2ccontroller创建i2ccontroller。
两种尝试都给了我同样的结果。
为什么甚至抱怨打电话给i2ccontroller,我不是通过对象而不是打电话给它?

i2controller(传递对象)

i2ccontroller.h

#pragma once
class i2cController
{
private:
  int foo;
public:
  i2cController(int Foo);
  void write(int value);
};

i2ccontroller.cpp

#include <i2cController.h>
i2cController::i2cController(int Foo)
{
  foo = Foo;
}
void i2cController::write(int value)
{
  foo++;
}

LED类(接收对象参考,源自)
错误起源于:Led::Led(int pin, i2cController &Controller);
LED.H

#pragma once
#include <i2cController.h>
class Led
{
private:
  i2cController controller;
  int pin;
public:
  Led(int pin, i2cController &Controller);
  void turnOn();
};

led.cpp

#include <Led.h>
Led::Led(int Pin, i2cController &Controller)
{
  controller = Controller;
  pin = Pin;
}
void Led::turnOn()
{
  controller.write(pin);
}

MAIN

i2cController controller(5);
Led led1 = new Led(led1Pin, controller);

问题来自LED类的构造函数。构造函数正在尝试初始化默认的i2cController controller;字段。构造函数还在寻找没有参数的默认I2CCONTROLLER构造函数,但未定义。

如果您需要参考,则如下所示。

class i2cController
{
private:
  int foo;
public:
  explicit i2cController(int Foo)
     foo(Foo) 
  {}
  void write(int value);
};
class Led
{
Led(Led&) = delete;
Led& operator=(Led&) = delete;
private:
  i2cController &controller;
  int pin;
public:
  Led(int pin, i2cController &Controller);
  ~Led() noexcept;
  void turnOn();
};
Led::Led(int Pin, i2cController &Controller)
  controller(Controller),
  pin(Pin)
{}
Led::~Led() noexcept
{}

如果您需要副本

class Led
{
private:
  i2cController controller;
  int pin;
public:
  Led(int pin,const i2cController &Controller);
  void turnOn();
};
Led::Led(int Pin,const const i2cController &Controller)
  controller(Controller),
  pin(Pin)
{}

在您的类Led中,您将controller作为一个字段,并且不初始化它,而是在Led构造体主体中使用分配,因此必须首先构造默认值。解决方案可能是初始化它并制作副本:

Led::Led(int Pin, i2cController &Controller) :
    controller( Controller ),
    pin( Pin )
{
}

那么您的问题应该消失

最新更新