仅头文件库循环依赖
Header-only library circular dependency
我正试图围绕外部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)句柄必须保持对资源的引用,并且(b)资源需要能够将句柄强制转换为void *。不幸的是,这会导致循环依赖。
关于如何重构这个有什么想法吗?
注意:答案不是简单地"包含xxx.hpp"或前向声明一个类。这需要以某种方式重组,我只是不太明白该怎么做。
将class Handle
作为前向声明添加到资源文件的顶部不起作用,因为(void *)
转换是Resource仍然无法看到的Handle定义的一部分。同样,将强制转换为void * ptr()
成员函数也会导致同样的问题。
将函数定义移动到.cpp文件中也不是答案——它需要是头文件。
好吧,这是模板的拯救(再次!):
// resource.hpp
class Resource;
template<typename TResource> class Handle;
class Resource {
public:
// RAII constructor, destructor, etc.
// ...
void do_something(const Handle<Resource> & h) {
do_something_impl( (void *) h);
}
};
// handle.hpp
template<class TResource>
class Handle {
public:
Handle(size_t n, const TResource & res)
: p_(res.allocate(n)), res_(res) {}
// cast operation
operator void *() const { return p_; }
private:
void * p_;
TResource & res_;
};
不要将头文件包含在彼此之间,而是使用向前声明类。这样,它们就可以用作引用或指针。
在resource.hpp:
中class Handle;
class Resource {
public:
// RAII constructor, destructor, etc.
// ...
void do_something(const Handle & h) {
do_something_impl( (void *) h);
}
};
And
class Resource;
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_;
};
由于在do_something
函数中使用void*
类型转换操作符,因此必须将该实现移动到单独的源文件中。在这个源文件中,你可以包括两个头文件,这样所有的函数都可以被访问。
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 如何在具有循环依赖的类中dynamic_cast?
- C++模板方法中的循环依赖关系
- 修复循环依赖项 c++17 标头
- 涉及全局对象的循环依赖C++
- 循环依赖,在继承类的情况下使用覆盖方法
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 错误 C2512 视觉C++(并且不是循环依赖项)
- CMake 外部和内部静态库的循环依赖关系
- 正在从继承中解析循环依赖项
- "std::shared_ptr"循环依赖关系是如何导致问题的
- 纯引用而不是weak_ptr来打破循环依赖关系
- "invalid use of incomplete type" .解决循环依赖关系
- 如何避免模板方法的循环依赖
- 循环依赖结构,使用前向声明时结构的错误重定义