Arduino C++ 将对象作为参数传递
Arduino C++ passing objects as parameter
我正在用 C++ 为 Arduino 编写一个小计时器 class,但我无法在不克隆的情况下通过引用正确传递它的实例。
这是 Timer.h :
#ifndef Timer_h
#define Timer_h
class Timer
{
public:
long t = 0 ;
long tMax = 60000 ;
Timer() ;
bool clocked(long n) ;
void wait(long ms) ;
} ;
#endif
这里是 Timer.cpp :
#include "Arduino.h"
#include "Timer.h"
Timer::Timer() {}
bool Timer::clocked(long n)
{
return (t % n) == 0 ;
}
void Timer::wait(long ms)
{
t += ms ;
delay(ms) ;
Serial.println(t) ;
if (t >= tMax) t = 0 ;
}
这是一个 main.ino 示例:
#include "Timer.h"
#include "ABC.h"
Timer timer = Timer() ;
ABC abc = ABC() ;
void setup()
{
Serial.begin(9600) ;
abc.setTimer(timer) ;
}
void loop()
{
timer.wait(100) ;
Serial.println(timer.t) ; // 100
Serial.println(abc.timer.t) ; // 0, should be 100
timer.wait(50) ;
abc.timer.wait(100) ;
Serial.println(timer.t) ; // 150, should be 250
Serial.println(abc.timer.t) ; // 100, should be 250
}
...以 ABC.h 为例:
#include "Timer.h"
class ABC
{
public:
Timer timer ;
ABC() ;
void setTimer(const Timer& tm) ;
} ;
... 和 ABC.cpp :
#include "Timer.h"
ABC::ABC() {}
void ABC::setTimer(const Timer& tm)
{
timer = tm ;
}
我确实在某处漏掉了一些 &
或 *
,但我想不通在哪里。
C++ 是一种高级语言。它支持值语义和引用语义,但是您已选择通过以下方式使用值语义:
Timer timer ;
在您的 class 定义中。相反,如果您想使用引用语义,您可以将其替换为 Timer *timer;
,或智能指针,例如 std::shared_ptr<Timer> p_timer;
或 std::unique_ptr<Timer> p_timer;
.
可以使用 C++ 引用(即 Timer &timer;
),但可能不适合您的情况,因为此引用只能在创建 ABC
.
时绑定
例如,使用 shared_ptr
将为您提供与 Java 中的对象引用最接近的匹配。当然,这意味着您必须使用 make_shared<Timer>()
或等价物创建要绑定到它的 Timer
对象。
使用unique_ptr
适用于任何时候只应存在一个对计时器的引用的情况。
使用原始指针占用的内存最少,但是您必须非常小心地确保 Timer
对象在 ABC
对象的整个生命周期内都存在,并在之后被删除那。
我正在用 C++ 为 Arduino 编写一个小计时器 class,但我无法在不克隆的情况下通过引用正确传递它的实例。
这是 Timer.h :
#ifndef Timer_h
#define Timer_h
class Timer
{
public:
long t = 0 ;
long tMax = 60000 ;
Timer() ;
bool clocked(long n) ;
void wait(long ms) ;
} ;
#endif
这里是 Timer.cpp :
#include "Arduino.h"
#include "Timer.h"
Timer::Timer() {}
bool Timer::clocked(long n)
{
return (t % n) == 0 ;
}
void Timer::wait(long ms)
{
t += ms ;
delay(ms) ;
Serial.println(t) ;
if (t >= tMax) t = 0 ;
}
这是一个 main.ino 示例:
#include "Timer.h"
#include "ABC.h"
Timer timer = Timer() ;
ABC abc = ABC() ;
void setup()
{
Serial.begin(9600) ;
abc.setTimer(timer) ;
}
void loop()
{
timer.wait(100) ;
Serial.println(timer.t) ; // 100
Serial.println(abc.timer.t) ; // 0, should be 100
timer.wait(50) ;
abc.timer.wait(100) ;
Serial.println(timer.t) ; // 150, should be 250
Serial.println(abc.timer.t) ; // 100, should be 250
}
...以 ABC.h 为例:
#include "Timer.h"
class ABC
{
public:
Timer timer ;
ABC() ;
void setTimer(const Timer& tm) ;
} ;
... 和 ABC.cpp :
#include "Timer.h"
ABC::ABC() {}
void ABC::setTimer(const Timer& tm)
{
timer = tm ;
}
我确实在某处漏掉了一些 &
或 *
,但我想不通在哪里。
C++ 是一种高级语言。它支持值语义和引用语义,但是您已选择通过以下方式使用值语义:
Timer timer ;
在您的 class 定义中。相反,如果您想使用引用语义,您可以将其替换为 Timer *timer;
,或智能指针,例如 std::shared_ptr<Timer> p_timer;
或 std::unique_ptr<Timer> p_timer;
.
可以使用 C++ 引用(即 Timer &timer;
),但可能不适合您的情况,因为此引用只能在创建 ABC
.
使用 shared_ptr
将为您提供与 Java 中的对象引用最接近的匹配。当然,这意味着您必须使用 make_shared<Timer>()
或等价物创建要绑定到它的 Timer
对象。
使用unique_ptr
适用于任何时候只应存在一个对计时器的引用的情况。
使用原始指针占用的内存最少,但是您必须非常小心地确保 Timer
对象在 ABC
对象的整个生命周期内都存在,并在之后被删除那。