C++:将对象引用作为参数传递会出现错误:调用class::function()时没有匹配的函数

C++:将对象引用作为参数传递会出现错误:调用class::function()时没有匹配的函数,c++,arduino,arduino-esp8266,C++,Arduino,Arduino Esp8266,将对象引用作为参数传递会导致错误: 对i2cController::i2cController的调用没有匹配的函数 我还尝试传递一个指针,并用new创建i2cController。 两次尝试都给了我相同的结果。 为什么它甚至抱怨调用i2cController,我不是在传递对象而不是调用它吗 i2Controller传递的对象 I2C控制器.h #pragma once class i2cController { private: int foo; public: i2cControl

将对象引用作为参数传递会导致错误: 对i2cController::i2cController的调用没有匹配的函数

我还尝试传递一个指针,并用new创建i2cController。 两次尝试都给了我相同的结果。 为什么它甚至抱怨调用i2cController,我不是在传递对象而不是调用它吗

i2Controller传递的对象

I2C控制器.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.cpp

#include <Led.h>

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

void Led::turnOn()
{
  controller.write(pin);
}

在您的类Led中,您将控制器作为一个字段,并且您不初始化它,而是在Led构造函数体中使用对它的赋值,所以它必须首先默认构造。解决方案可以是对其进行初始化并制作副本:

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

然后您的问题应该消失了

问题来自Led类的构造函数。构造函数正在尝试初始化默认的i2cController;领域构造函数也在寻找没有参数的默认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)
{}

I2C控制器;将需要一个defaiult构造函数,除非您将从Led构造函数中使用的成员初始值设定项列表中分配它。将该成员作为引用可能太远,并且会产生其他影响。@Slava只是使Led不可压缩,为了避免这种情况。谢谢,但我想要一个引用/指针来节省内存,因为它是用于内存有限的Arduino的。您需要了解您正在做什么,然后,您可能会遇到对象生存期问题
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)
{}