1

基于我的问题:C++ 无法建立对“父”对象的句柄引用——循环包含或未定义的类型错误我想创建一个具有两个泛型类型成员的类(称为节点),一个指向类型的泛型指针待确定的父对象和指向一组待确定子对象的元素的通用指针向量。存在于双向树结构中的对象将从 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' is an undeclared identifier”和 C4430“缺少类型说明符 - 假定为 int”错误。我在这里找到了一些关于创建模板类和函数的有用文档:http ://www.cprogramming.com/tutorial/templates.html但该教程和我能找到的任何其他文档似乎都没有涵盖使用模板来声明泛型类非模板类中的成员;我相当确定这(或类似的东西)是我需要为我的用例做的,那么在标准 C++ 类中声明和使用泛型成员变量的正确方法是什么?

4

3 回答 3

3

您绝对应该花一些时间了解模板的工作原理,并从简单的东西开始。我花了数年时间才能够创建复杂的模板对象,而无需进行大量编译器错误调试,甚至花费了更长的时间来设计代码结构以最小化这种复杂性。

但这就是我认为你的意图。您的模板中有太多信息,只需要将类型名称删除到 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_*/

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

vector<Child> children;

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

于 2012-08-07T16:51:54.713 回答
1

除了向您已经包含的数据添加其他信息之外,parent我看不到您需要什么。node这是链表中的典型情况,您需要注入一个nextprev指针来维护结构。

当您已经在处理指针时,这似乎没有必要:

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

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

于 2012-08-07T16:51:43.947 回答
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模板参数。

另外,我不认为你真的想要一个指向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
};

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

于 2012-08-07T16:53:33.243 回答