在库中隐藏类的使用

Hiding use of class inside a library

本文关键字:隐藏      更新时间:2023-10-16

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

我在一定程度上简化了这个例子以保持清晰,但同样的问题也存在。

我试图包装的类是名为TwoWire的Wire库。

包装器库的头文件:

#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/librarys/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/librarys/DerivedWire/DerivedWire.h:9:错误:ISO C++禁止声明没有类型的"TwoWire"/Users/andrew/Documents/Arduino/librarys/DerivedWire/DerivedWire.h:9:错误:应为";"在'*'标记之前

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

我该如何解决这个问题?

Wire实例在库的最后一行创建。https://github.com/lstoll/arduino-libraries/blob/master/Wire/Wire.cpp你不应该有多个TwoWire实例,也没有理由隐藏它,但如果你真的想隐藏它,你必须删除那一行。arduino构建方法要求库包含在主草图中,这样在没有重大更改的情况下就无法隐藏该部分。

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

查看"皮条客习惯用法",这里有一个链接可以帮助您入门:http://en.wikipedia.org/wiki/Opaque_pointer

Pimpl习惯用法是C++中隐藏类实现和所有不希望可见的函数的一种方法。