2014-11-02 72 views
0

刚刚完成创建我的二叉树类仅意识到我应该将其作为模板。我花了几个小时试图将其转换为模板,但是我一直在收到大量的错误,从“模板名的无效使用”到“成员的额外限定”。我对模板的概念很陌生,但我对我想要达到的目标有一个概念。将C++类转换为模板类

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

将我的过程转换为单个模板文件应该如何?

+1

首先实现这个非模板并不难过。这叫做'提升'。创建一个仅仅处理'int'或'string'并使其正常工作的类通常更容易,然后提出一般形式。 http://www.generic-programming.org/about/intro/lifting.php – Steve 2014-11-02 04:09:14

+0

为什么在构造函数中复制两次startboard和startplayer? – 2014-11-02 05:29:37

+0

@NeilKirk从我大幅改变班级时的剩余代码,没有意识到那些行现在是多余的;感谢您的支持 – Matt 2014-11-02 05:43:26

回答

0

好,让我们先来看看你的代码有什么错误或其他缺陷:

  • BTree有自定义的Dtor,因为它拥有资源。但是您违反了3的规则:
    您至少需要定义或删除您的赋值运算符和copy-ctor。
    作为替代(优选),将BTNode *root;更改为使用std::unique_ptr
  • 实现文件中包含的第一件事应该始终是它自己的头文件,以便在头文件中查找错误的相关性。
  • 标题应包含所有需要使用它的内容,而不是多一点。

现在,有很好的理由,模板通常仅邮件头:

编译器需要定义来实例化它。
利用这个机会将一些功能移入课堂。

接下来,定义模板是这样的:

template<class T> class BTree { 
    int BTree::sumtree(); 
}; 

和非内联成员是这样的:

template<class T> int BTree<T>::sumtree() { 
    return //... 
} 

在模板中,你可以使用类型参数像一个正常的类型。

关于BTNode的注意事项:这是一个BTree的实现细节,因此将其定义放入类中(这使得它的模板相同,并且使用起来也更容易。)
或者,如果您实际上并不需要BTNode的所有模板参数(或者想分享它的实现),请单独对其进行模板化。
不要忘记更改BTree的所有参考。

+0

请你详细说明'std :: unique_ptr',我不明白我是如何使用这个指针错误的。 – Matt 2014-11-02 04:35:30

+0

@Matt:我不是说你使用的指针是错的,我是说隐式定义的复制构造函数和赋值运算符对你来说是错误的。 ['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)是一个智能指针,可以简化处理内存分配和重新分配。 (允许您删除dtor并改为遵循零规则。) – Deduplicator 2014-11-02 04:43:05

0

首先要在C++中使用模板,所有的可执行代码需要在.h文件中,以便在编译时可用。

然后到模板类,通常的方式是让喜欢:

template<class T> 
class BTree 
{ 
    Btree(T startPlayer) 
    { 
     player = startPlayer; 
    } 
    // ... snip ... 
    T player; 
} 
+0

我是否正确实施了此项目? http://pastebin.com/7sP7cndb 我收到编译这个错误http://pastebin.com/HpjCcCay – Matt 2014-11-02 04:32:54

+0

@Matt:你仍然有我列出的所有错误和赤字。 – Deduplicator 2014-11-02 04:34:53

+0

“g ++ main.o board.o board.h BTNode.o BTNode.h BTree.h -o test” 您应该永远不要编译.h文件 – Eric 2014-11-02 04:34:53