我試圖圍繞外部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_;
};
這裏的問題是,(一)該手柄具有保留對資源的引用,和(b)所需要的資源,以便能夠在手柄轉換成爲void *。不幸的是,這導致了循環依賴。
任何想法如何重組這?
注意:答案不是簡單地「包含xxx.hpp」或轉發聲明其中一個類。 這需要重新調整,我只是不太明白。
將class Handle
作爲前向聲明添加到資源文件的頂部不起作用,因爲(void *)
轉換是Resource仍然看不到的Handle定義的一部分。同樣,將演員改爲void * ptr()
成員函數也會導致相同的問題。
將函數定義移動到.cpp文件也不是答案 - 它需要僅用於標題。
[當使用向前聲明?](http://stackoverflow.com/questions/553682/when-to-use-forward -claclaration) – Joe
除了使用前向聲明之外,請確保使用標頭警衛。 – drescherjm
@Joe:向前聲明在這裏不起作用(見編輯)。 –