隐藏在库中使用类

时间:2014-02-20 12:40:27

标签: c++ class arduino

我正在为Arduino创建一个简单的库,其目的是包装并隐藏其中的另一个类。我希望能够完全从最终用户隐藏底层类。

我稍微简化了这个例子以保持清晰,但存在同样的问题。

我想要包装的类是Wire library,它被称为TwoWire。

包装器库的头文件:

#ifndef __DERIVEDONEWIRE2_H__
#define __DERIVEDONEWIRE2_H__

#include <Wire.h>

class DerivedWire
{
private:
    TwoWire wire;

public:
    DerivedWire();
};
#endif

CPP档案:

#include "DerivedWire.h"

DerivedWire::DerivedWire()
{
}

使用它的Arduino草图:

#include <DerivedWire.h>

DerivedWire derivedWire;

void setup()
{
}

void loop()
{
}

无法编译:

  

/Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h:9:   错误:'TwoWire'没有命名类型

在主草图的顶部包含Wire.h允许编译:

#include <DerivedWire.h>
#include <Wire.h>

DerivedWire derivedWire;

void setup()
{
}

void loop()
{
}

但是,我想完全隐藏DerivedWire库的用户,完全使用Wire库/ TwoWire类。

我试过换线“TwoWire wire;”到“TwoWire * wire;” - 现在我收到以下错误:

  

/Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h:9:   错误:ISO C ++禁止声明没有类型的“TwoWire”   /Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h:9:   错误:预期';'在'*'标记之前

我尝试过其他一些东西,但似乎我需要将Wire.h包含在顶层。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

在lib的最后一行创建Wire实例。 https://github.com/lstoll/arduino-libraries/blob/master/Wire/Wire.cpp 你不应该有多个TwoWire实例,并且没有理由隐藏它,但如果你真的想隐藏它,你必须删除该行。 arduino构建方法要求lib包含在主草图中,因此如果没有显着的更改,则无法隐藏该部分。

如果你真的需要隐藏这个Wire实例,你可以将Wire lib的源代码复制到你自己的lib中,并删除最后一行。

答案 1 :(得分:0)

查看“pimpl idiom”,这是一个帮助您入门的链接:http://en.wikipedia.org/wiki/Opaque_pointer

Pimpl习惯用法是C ++中隐藏类实现的一种方式,以及您不希望看到的所有函数。