我正在尝试围绕外部 C API 创建一个仅限标头的 C++ 库。C API 使用void *
指针作为句柄。这是想法:
// resource.hpp
class Resource {
public:
// RAII constructor, destructor, etc.
// ...
void do_something(const Handle & h) {
do_something_impl( (void *) h);
}
};
// handle.hpp
class Handle
{
public:
Handle(size_t n, const Resource & res)
: p_(res.allocate(n)), res_(res) {}
// cast operation
operator void *() const { return p_; }
private:
void * p_;
Resource & res_;
};
这里的问题是 (a) Handle 必须保留对 Resource 的引用,并且 (b) Resource 需要能够将 Handle 转换为 void *。不幸的是,这导致了循环依赖。
关于如何重组它的任何想法?
注意:答案不是简单地“包含 xxx.hpp”或前向声明其中一个类。这需要以某种方式重组,我只是不太明白如何。
将 aclass Handle
作为前向声明添加到 Resource 文件的顶部不起作用,因为强制转换(void *)
是 Resource 仍然无法看到的 Handle 定义的一部分。同样,将强制转换更改为void * ptr()
成员函数会导致相同的问题。
将函数定义移动到 .cpp 文件也不是答案——它必须是仅标题。