我可以在 C++ 中使用 class 来控制来自另一个 class 的对象吗? (阿杜伊诺)

Can I use a class to control objects from another class in C++? (Arduino)

我正在尝试使用 Arduino 来控制带有 3 个电机的机器人底座。我有一个 class 来控制每个名为 SimpleMotor 的 class 个性,并想要一个 class 来控制 3 个名为 Driver 的 SimpleMotor。

我希望能够初始化 3 个 SimpleMotors,然后用电机对象初始化一个 Driver 对象。以下是我的代码和错误信息: 代码: class简单电机{ public: int motorSpeed = 127; //值从0-255 int hallPin; int enablePin; int in1Pin; int in2Pin;

    SimpleMotor::SimpleMotor(int ePin, int d1Pin, int d2Pin) {        
      enablePin = ePin;
      in1Pin = d1Pin;
      in2Pin = d2Pin;
    }

    void SimpleMotor::Direction(bool dir) { //true is cw, false is ccw
      if (dir) {
        digitalWrite(in1Pin, HIGH);
        digitalWrite(in2Pin, LOW);
      }
      else {
        digitalWrite(in1Pin, LOW);
        digitalWrite(in2Pin, HIGH);
      }
    }
    
    void SimpleMotor::WriteSpeed(int motorPower){
      if(motorPower < 0)  {Direction(0);}
      else  {Direction(1);}

      analogWrite(enablePin, motorPower);
    }

    void SimpleMotor::Stop(){
      analogWrite(enablePin, 0);
    }
};

class Driver{
  friend class SimpleMotor;
  public:
    SimpleMotor m1;
    SimpleMotor m2;
    SimpleMotor m3;    

    Driver::Driver(SimpleMotor motor1, SimpleMotor motor2, SimpleMotor motor3) {
      m1 = motor1;
      m2 = motor2;
      m3 = motor3;
    }

    void Driver::Spin(int stickX){
      if(stickX<0){
        m1.Direction(0);
        m2.Direction(0);
        m3.Direction(0);
      }
      else{
        m1.Direction(1);
        m2.Direction(1);
        m3.Direction(1);
      }

      m1.WriteSpeed((int) floor(stickX/4));
      m2.WriteSpeed((int) floor(stickX/4));
      m3.WriteSpeed((int) floor(stickX/4));

    }

};

错误:

HolonomicDriver:46:80: error: no matching function for call to 'SimpleMotor::SimpleMotor()'

     Driver::Driver(SimpleMotor motor1, SimpleMotor motor2, SimpleMotor motor3) {

                                                                                ^

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note: candidate: SimpleMotor::SimpleMotor(int, int, int)

     SimpleMotor::SimpleMotor(int ePin, int d1Pin, int d2Pin) {

     ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note:   candidate expects 3 arguments, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(const SimpleMotor&)

 class SimpleMotor {

       ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(SimpleMotor&&)

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

HolonomicDriver:46:80: error: no matching function for call to 'SimpleMotor::SimpleMotor()'

     Driver::Driver(SimpleMotor motor1, SimpleMotor motor2, SimpleMotor motor3) {

                                                                                ^

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note: candidate: SimpleMotor::SimpleMotor(int, int, int)

     SimpleMotor::SimpleMotor(int ePin, int d1Pin, int d2Pin) {

     ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note:   candidate expects 3 arguments, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(const SimpleMotor&)

 class SimpleMotor {

       ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(SimpleMotor&&)

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

HolonomicDriver:46:80: error: no matching function for call to 'SimpleMotor::SimpleMotor()'

     Driver::Driver(SimpleMotor motor1, SimpleMotor motor2, SimpleMotor motor3) {

                                                                                ^

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note: candidate: SimpleMotor::SimpleMotor(int, int, int)

     SimpleMotor::SimpleMotor(int ePin, int d1Pin, int d2Pin) {

     ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:10:5: note:   candidate expects 3 arguments, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(const SimpleMotor&)

 class SimpleMotor {

       ^~~~~~~~~~~

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note: candidate: constexpr SimpleMotor::SimpleMotor(SimpleMotor&&)

c:\Users\mmell\Documents\Arduino\HolonomicDriver\HolonomicDriver.ino:2:7: note:   candidate expects 1 argument, 0 provided

exit status 1

谢谢!

正如@sweenish 已经提到的,您需要修复与构造函数相关的错误。你有两种方式:

1.Add 默认构造函数:

SimpleMotor::SimpleMotor() = default;

这是

的一个较短的等价物
SimpleMotor::SimpleMotor() : enablePin{0}, in1Pin{0}, in2Pin{0}
{
}

这种方法的缺点是冗余构造+赋值,而且每个电机还有2个副本,每个都可以控制你的机器人,一个在main函数中,一个在你的Driver对象中:

// in main
SimpleMotor motor1(1,2,3); // can control your motor
Driver driver(motor1, ...);
// in Driver class
SimpleMotor m1; // here we create m1{0, 0, 0} with default constructor
// in Driver constructor
m1 = motor1; // assign motor1 to m1. m1 can also control your motor

2.Use 驱动程序中的指针(或引用):

class Driver {
public:
    std::shared_ptr<SimpleMotor> m1;
    std::shared_ptr<SimpleMotor> m2;
    std::shared_ptr<SimpleMotor> m3;    
        
    Driver::Driver(std::shared_ptr<SimpleMotor> motor1, std::shared_ptr<SimpleMotor> motor2, std::shared_ptr<SimpleMotor> motor3) {
        m1 = motor1;
        m2 = motor2;
        m3 = motor3;
    }
};

然后您还需要更改创建 SimpleMotors 的方式,例如:

auto m1 = std::make_shared<SimpleMotor>(1, 2, 3);
auto m2 = std::make_shared<SimpleMotor>(5, 6, 7);
auto m3 = std::make_shared<SimpleMotor>(4, 8, 9);

Driver d(m1, m2, m3);

当然,您可以使用原始指针或 uniques_ptr。您可以在此处找到有关 shared_ptr 的更多信息:https://en.cppreference.com/w/cpp/memory/shared_ptr

感谢大家的帮助!

添加:

SimpleMotor::SimpleMotor() = default;

在我的 SimpleMotor class 中工作。

非常感谢大家的帮助!