在类中使用泛型类成员

问题描述:

在此处构建我的问题: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

你似乎完全不关心C++。我建议在处理模板之前先掌握基本语言。在这里,你可能应该首先写一些特定的类型,然后使其通用。 – pmr 2012-08-07 16:46:45

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

但这是我认为你的意图。您的模板中有太多信息,只需将类型名称删除到Parent和Child(如果需要,也可以使用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; 

否则,您需要为如何删除树创建一个很好的结构。另一种方法是使用智能指针,一旦它们未被使用就会删除它们(对于难以追踪的抽象结构很有用)。请参阅Boost Smart Pointers或来自C++后期修订版的等价物,但它们需要特别注意循环引用。

+0

很酷,谢谢。对于Google员工:还值得注意的是,我遗漏了std命名空间的向量;如果没有'使用名称空间标准'或指定'std :: vector',上面的代码将无法编译。请参阅下面的@ pmr的答案,以便正确使用 – CCJ 2012-08-07 18:46:44

+0

@CCJ很高兴它有帮助。为了正确,我将std :: vector添加到了答案中。 – Pyrce 2012-08-07 21:39:49

我没有看到你需要什么parentnode除了将 附加信息添加到你已经包含的数据。这是一个 链接列表中的典型情况,您需要注入一个nextprev指针来维护结构。

当你已经处理球,这似乎是没有必要的:

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

对我来说,这仍然是一个可怕的很多指针并没有对象 管理呢。

您的代码应该这样写:

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模板参数。

另外,我不认为你真的想要一个指向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智能指针类。