C++: passing object reference as parameter gives error: no matching function for a call to class::function()

C++: passing object reference as parameter gives error: no matching function for a call to class::function()

将对象引用作为参数传递给我错误:
No matching function for a call to 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 class(接收对象引用,错误源自)
错误源自: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);
}

主要

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

在你的 class Led 你有 controller 作为一个字段,你没有初始化它,但在 Led 构造函数体中使用赋值给它,所以它必须先默认构造。解决方案可能是初始化它并制作副本:

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

那么你的问题应该就消失了

问题来自 Led class 的构造函数。构造函数正在尝试初始化默认 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)
{}