我无法实现使用模板的红黑树。我已阅读并理解其目的,但不知道如何将其实现到头文件和.cpp文件中。我在一些论坛中读到,他们必须在与模板相同的文件中,而其他人说它们可以分开但在.hpp文件中。
头文件
enum nodeColor { RED, BLACK };
template <class myType>
struct nodeType
{
myType keyValue;
nodeColor color;
nodeType<myType> *left;
nodeType<myType> *right;
nodeType<myType> *parent;
};
template<class myType>
class redBlackTree
{
public:
redBlackTree() {}
~redBlackTree() {}
void destroyTree();
unsigned int countNodes() const;
unsigned int height() const;
void printTree() const;
void insert(myType);
bool search(myType);
private:
bool search(myType, nodeType<myType> *);
void destroyTree(nodeType<myType> *);
unsigned int countNodes(nodeType<myType> *) const;
unsigned int height(nodeType<myType> *) const;
void printTree(nodeType<myType> *) const;
void rightRotate(nodeType<myType> *);
void leftRotate(nodeType<myType> *);
};
.cpp文件
#include "redBlackTree.h"
using namespace std;
redBlackTree::redBlackTree()
{
}
redBlackTree::~redBlackTree()
{
}
void redBlackTree::destroyTree()
{
}
unsigned int redBlackTree::countNodes() const
{
}
unsigned int redBlackTree::height() const
{
}
void redBlackTree::printTree() const
{
}
void redBlackTree::insert(myType)
{
}
bool redBlackTree<myType>::search(myType)
{
}
bool redBlackTree::search(myType, nodeType<myType> *)
{
}
void redBlackTree::destroyTree(nodeType<myType> *)
{
}
unsigned int redBlackTree::countNodes(nodeType<myType> *) const
{
}
unsigned int redBlackTree::height(nodeType<myType> *) const
{
}
void redBlackTree::printTree(nodeType<myType> *) const
{
}
void redBlackTree::rightRotate(nodeType<myType> *)
{
}
void redBlackTree::leftRotate(nodeType<myType> *)
{
}
我也知道我没有包含参数。我主要是在询问如何处理这个问题,以便我可以编写代码。
答案 0 :(得分:3)
有一些方法可以在.cpp文件中实现类模板,但最常用的方法是在.hpp(或.h)文件中实现它们。请参阅Why can templates only be implemented in the header file?。
更重要的是,您可能不会使用:
redBlackTree::redBlackTree()
{
}
实现类模板成员函数。该语法只能用于类。你需要使用:
template <typename myType>
redBlackTree<myType>::redBlackTree()
{
}
并对所有其他功能进行更改。
答案 1 :(得分:0)
以任何方式使用myType
的所有函数都需要在.hpp文件中。这是因为所有翻译单元都需要能够访问函数的完整定义才能实例化模板。
如果要将它们保存在单独的文件中,可以创建另一个.hpp文件,将其放入,然后#include
放在第一个.hpp文件中。
有些人喜欢为此实施文件使用不同的文件结尾,例如.tcc
。