Arduino C ++将对象作为参数传递

时间:2015-03-30 23:05:45

标签: c++ pointers arduino

我正在用C ++为Arduino编写一个小的Timer类,但是我无法通过引用正确地传递它的实例而不进行克隆。

这是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 ;
}

我肯定会错过某个&*,但我无法弄明白。

1 个答案:

答案 0 :(得分:2)

C ++是一种高级语言。它支持值语义和引用语义,但是您选择通过编写:

来使用值语义
Timer timer ;

在您的班级定义中。如果您想使用引用语义,则可以将其替换为Timer *timer;或智能指针,例如std::shared_ptr<Timer> p_timer;std::unique_ptr<Timer> p_timer;

使用C ++引用(即Timer &timer;)是可能的,但可能不适合您的情况,因为此引用只能在创建ABC时绑定。

例如,使用shared_ptr将为您提供与Java中对象引用最接近的匹配。当然,这意味着您必须使用Timer或同等对象创建绑定到它的make_shared<Timer>()对象。

使用unique_ptr适用于任何时候只应存在一个对计时器的引用。

使用原始指针具有最小的内存占用量,但是您必须非常小心地确保Timer对象在ABC对象生命周期的整个持续时间内都存在,并且之后删除。