我刚刚完成创建我的二叉树类只是为了意识到我应该把它作为模板。我花了几个小时试图将其转换为模板,但我不断收到大量错误,从“无效使用模板名称”到“额外的成员资格”。我是模板概念的新手,但我知道我想要实现的目标。
BTree.cpp
#include <iostream>
#include <string>
#include "BTree.h"
using namespace std;
BTree::BTree(board startboard, string startplayer)
{
treeboard = startboard;
player = startplayer;
root = new BTNode(treeboard, player,-1,-1);
}
BTree::~BTree()
{
delete root;
}
int BTree::sumtree()
{
if (root->getvalue(-1) > root->getvalue(1))
return root->getchildposition(-1);
else
return root->getchildposition(1);
}
BTree.h
#include <string>
#include "BTNode.h"
#include "board.h"
using namespace std;
class BTree
{
public:
BTree(board startboard, string startplayer);
~BTree();
int sumtree();
private:
string player;
board treeboard;
BTNode *root;
};
'startplayer'目前是一个字符串,我希望这是通用模板类型。
我的流程应该将其转换为单个模板文件?
答案 0 :(得分:0)
首先要在C ++中使用模板将所有可执行代码NEEDS放在.h文件中,以便在编译时可用。
然后为你的课程模板,通常的方法是使它像:
template<class T>
class BTree
{
Btree(T startPlayer)
{
player = startPlayer;
}
// ... snip ...
T player;
}
答案 1 :(得分:0)
好吧,让我们先看看您的代码有哪些错误或其他缺陷:
BTree
有自定义dtor,因为它拥有资源。但是你违反了3规则:BTNode *root;
更改为使用std::unique_ptr
。现在,有充分理由说明模板通常只是标题:
编译器需要定义来实例化它 利用这个机会将一些功能移到课堂上。
接下来,您可以定义如下模板:
template<class T> class BTree {
int BTree::sumtree();
};
这样的非内联成员:
template<class T> int BTree<T>::sumtree() {
return //...
}
在模板中,您可以像普通类型一样使用type-argument。
关于BTNode
的说明:它是BTree
的实现细节,因此将其定义放入类中(这使得模板化也相同并且也更容易使用它。)
或者,如果您实际上并不需要BTNode
的所有模板参数(或者想要共享其实现),请单独对其进行模板化。
不要忘记更改BTree
的所有引用。