我可以在 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 中工作。
非常感谢大家的帮助!
我正在尝试使用 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 中工作。
非常感谢大家的帮助!