在类中使用泛型类成员

时间:2012-08-07 16:42:27

标签: c++ templates generics polymorphism

基于我的问题:C++ cannot establish handle reference to 'parent' object -- circular includes or undefined type errors我想创建一个类(称为Node),它有两个泛型类型成员,一个指向要确定类型的父对象的通用指针和一个向量指向一组待确定类型的子对象的元素的泛型指针。存在于双向树结构中的对象将从Node继承,并且可以在必要时填充其父节点和子节点成员,因为该数据可用。到目前为止,这是Node.h的目的:

#include <vector>

#ifndef NODE_H_
#define NODE_H_

template<typename T> class parent{};
template<typename T2> class child{};
class Node{

private:
parent<T>* parent_ptr;
vector<child<T2>>* children_ptr;

public:
 //some accessor methods will go here to get and set the parent and children
};
#endif /*NODE_H_*/

显然这不是在C ++中使用模板的正确方法,因为我收到错误C2065“'T'是未声明的标识符”和C4430“缺少类型说明符 - int假定”错误。我在这里找到了一些有关创建模板类和函数的有用文档:http://www.cprogramming.com/tutorial/templates.html但是我找不到的教程或任何其他文档似乎都涵盖了使用模板在非模板类中声明泛型类成员;我很确定这个(或类似的东西)是我需要为我的用例做的事情,那么在标准C ++类中声明和使用泛型成员变量的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

你绝对应该花时间了解模板的工作方式,并从简单的事情开始。我需要花费数年的时间才能创建复杂的模板对象而不需要进行大量的编译器错误调试,甚至更长的时间来设计能够最大限度地降低复杂性的代码结构。

但这就是我认为你的意图。您的模板中有太多信息,只需要将类型名称删除到父级和子级(如果需要,可以删除T和T2 - 尽管这些名称令人困惑)。

#include <vector>

#ifndef NODE_H_
#define NODE_H_

template<typename Parent, typename Child>
class Node{

private:
Parent* parent_ptr;
std::vector<Child*> children_ptr;

public:
 //some accessor methods will go here to get and set the parent and children
};
#endif /*NODE_H_*/

另外作为旁注,您可能需要父母所有权情况,父母拥有子女并在完成后释放他们的记忆(如果每个孩子只有1个父母拥有)。在这种情况下,向量将变为:

vector<Child> children;

否则,您需要为如何删除树创建一个很好的结构。另一种方法是使用智能指针,它们在未使用时会自行删除(适用于难以跟踪的抽象结构)。请参阅后面版本的C ++中的Boost Smart Pointers或等效内容,但需要特别注意循环引用。

答案 1 :(得分:1)

除了添加之外,我看不到您需要parentnode 您已包含的数据的其他信息。这是一个 链接列表中的典型案例,您需要注入next和。{ prev指针维护结构。

当你处理指针时,这似乎没有必要:

template<typename Parent, typename Child>
class Node {
  Parent* parent;
  std::vector<Child*> children;
};

对我来说,这仍然是一个非常多的指针,没有对象 管理层。

答案 2 :(得分:1)

您的代码应该是这样写的:

template<typename Parent, typename Child>
class Node
{
private:
    Parent* parent_ptr;
    vector<Child>* children_ptr;

public:
    //some accessor methods will go here to get and set the parent and children
};

您拥有它的方式,只有(空)parent类具有T模板参数,并且只有(空)child类具有T2 } template parameter。

另外,我认为你真的不想要指向vector的指针。你可能会这样做,但这是一个非常奇怪的用法。

但实际上,我认为简单地使用继承会更有意义:

class Node
{
private:
    Node* parent_ptr; // a pointer to a Node, or any Node-derived object
    vector<Node*>* children_ptr; // a vector of pointers to Nodes or Node-derived objects

public:
    //some accessor methods will go here to get and set the parent and children
};

vector指针非常烦人。我可能会将vector包装在一个内部处理内存分配的类中,或者查找一些C ++ 11 STL智能指针类。