我正在为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包含在顶层。
我该如何解决这个问题?
答案 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 ++中隐藏类实现的一种方式,以及您不希望看到的所有函数。