在这里基于我的问题:C++ cannot establish handle reference to 'parent' object -- circular includes or undefined type errors我想创建一个类(称为Node),该类具有两个泛型类型的成员,指向要确定类型的父对象的泛型指针和指向元素的泛型指针的 vector 一组待确定类型的子对象。以双向树结构存在的对象将从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++类中声明和使用泛型成员变量的正确方法是什么?

最佳答案

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

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

另外请注意,您可能需要 parent 所有权的情况,即 parent 拥有自己的 child ,并在完成后释放他们的记忆(如果每个 child 恰好由1个 parent 拥有)。在这种情况下, vector 将变为:
vector<Child> children;

否则,您将需要为删除树创建一个不错的结构。另一种选择是使用智能指针,这些指针一旦不被使用就删除自己(对于难以跟踪的抽象结构很有用)。请参阅Boost Smart Pointers或C++更高版本中的等效文件,尽管它们需要特别注意循环引用。

10-07 19:11
查看更多