在我的业余时间(作为一个学习练习),我一直在用C++创建一些模板化的容器和分配器,类似于作为标准模板库的一部分提供的模板。C++模板类循环依赖
到目前为止,我所做的容器单向链表,双向链表,栈,队列和。堆栈和队列都使用单链表作为它们的内部结构,因为我同时存储头指针和尾指针。
现在到了我的第一个allocator类的池分配器。内部它使用我的筹码对象获取和释放预分配的对象之一。我现在想用这个Pool Allocator与我的单链表和双链表进行结合,以便预先分配存储数据的内部节点对象。在我看来,现在这个样子创造了我的项目循环依赖问题。
我在非模板类上解决像这样的依赖性问题的常用方法通常涉及向前声明,指针和将实现分割为cpp文件。这个问题似乎出现了,因为我无法将模板代码声明和实现分离到各自的.h和.cpp文件中。
进一步参考的一些代码:
SinglyLinkedList.h:
#include "PoolAllocator.h" //Adding this line creates a compile error
template<typename T> class SinglyLinkedList
{
private:
Node<T> *_Head, *_Tail;
public:
void PushFront(T *obj)
{
//Allocate new node object and set it as _Head
}
void PushBack(T *obj)
{
//Allocate new node object and set it as _Tail
}
T *PopFront()
{
//Remove _Head and return node data
}
};
Stack.h:
#include "SinglyLinkedList.h"
template<typename T> class Stack
{
private:
SinglyLinkedList<T> _List;
public:
void Push(T *obj)
{
_List.PushFront(obj);
}
T *Pop()
{
return _List.PopFront();
}
};
PoolAllocator.h:
#include "Stack.h"
template<typename T> class PoolAllocator
{
private:
Stack<T> _Pool;
public:
void Initialize(unsigned int capacity)
{
//Dynamically allocate a bunch of T and push them onto _Pool
}
T *Acquire()
{
//Remove an item from _Pool and return it
}
void Release(T *obj)
{
//Push the object back onto the _Pool
}
void Dispose()
{
//Free all memory from _Pool
}
};
我是有点不确定最好的解决方法这个问题。我能想到的唯一方法是让Pool Allocator不使用我的任何容器类。我想我可以创建一个独立于分配器类的内部链表类,但这似乎是不必要的代码重复。
如果有人对此有任何见解,我会很高兴听到它。我希望我已经完全覆盖了所有内容,并提供了可接受的代码示例如果有任何缺少的信息,请让我知道。提前致谢。
[解决模板类之间的循环依赖关系]可能的重复(http://stackoverflow.com/questions/3353831/resolving-a-circular-dependency-between-template-classes) –
我忘记把标头警卫放入我的例子,但他们在那里。我也试过这个链接,没有运气:( –
即使你可以得到这个编译,我不明白它是如何工作的 - 为了在'PoolAllocator'内部填充'Stack',你将东西推到它上面,调用'List.PushBack()',它会去到一个未初始化的'PoolAllocator'来获得内存,右 –