将C ++类转换为模板类

时间:2014-11-02 03:58:05

标签: c++ templates

我刚刚完成创建我的二叉树类只是为了意识到我应该把它作为模板。我花了几个小时试图将其转换为模板,但我不断收到大量错误,从“无效使用模板名称”到“额外的成员资格”。我是模板概念的新手,但我知道我想要实现的目标。

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'目前是一个字符串,我希望这是通用模板类型。

我的流程应该将其转换为单个模板文件?

2 个答案:

答案 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的所有引用。