【发布时间】:2011-04-01 07:58:43
【问题描述】:
我不确定这是否可能,但这里是:
我有一个库,其界面充其量是复杂的。不幸的是,它不仅是一个 3rd-party 库(而且太大而无法重写),我正在使用一些其他依赖于它的库。所以这个界面必须保持原样。
为了解决这个问题,我试图从本质上包装接口并将所有依赖项的接口捆绑到更少、更多逻辑的类中。那部分进展顺利,效果很好。大多数包装类都包含一个指向原始类之一的对象的指针。像这样:
class Node
{
public:
String GetName()
{
return this->llNode->getNodeName();
}
private:
OverlyComplicatedNodeClass * llNode; // low-level node
};
我唯一的问题是次要问题。除了简化界面,我想删除链接到原始标题/库的要求。
这是第一个困难。如何以不需要包含原始标题的方式包装类?包装器将被构建为共享库 (dll/so),如果这样更简单的话。
原始类是指针,不用于任何导出函数(尽管它们在少数构造函数中使用)。
我玩弄了一些想法,包括预处理器的东西,例如:
#ifdef ACCESSLOWLEVEL
# define LLPtr(n) n *
#else
# define LLPtr(n) void *
#endif
这是丑陋的,充其量。它基本上可以满足我的需求,但我更喜欢那种混乱的真正解决方案。
某种指针类型的魔法起作用了,直到我遇到了一些使用共享指针的函数(某种提供引用计数的自定义 SharedPtr<> 类),更糟糕的是,一些特定于类的共享指针从基本SharedPtr 类(例如NodePtr)。
是否有可能以只需要包含我的标题以链接到我的动态库的方式包装原始库?不需要链接到原始库或从中调用函数,只是我的。我遇到的唯一问题是使用的类型/类。
这个问题可能不是很清楚。如果有帮助,我可以尝试清理它并添加更多代码示例。我并不真正担心任何性能开销或此方法的任何内容,只是尝试使其首先工作(过早的优化等等)。
【问题讨论】:
-
为此,您通常需要包装所有内容,并在源文件中实现。
-
我正在包装所有内容,并导出执行我需要访问的功能。不知道你的意思,确切地说。包装共享指针类等?这行得通,但我在标题中仍然偶尔有指向 x 的指针。所有实现都在源代码中。
-
这不是与 PIMPL(私有实现)习语有关吗?