2

我已经很久没有进行任何 C++ 编程了,如果有人能指导我创建一个 Node 类,该类的私有变量之一是 Node 类的对象列表(或向量),我将不胜感激。

我希望创建一个这样的类结构:

class Node {
private:
  string ID;
  vector < Node > list;
public:
  Node();
  void some_Function();
};

这是正确的方法吗?一个类是否可以将其私有成员之一作为相同类类型的对象列表?

4

4 回答 4

8

你不能。

当你定义一个类型的对象时vector<T>T它必须是一个完整的类型,直到类定义结束。

一些编译器无论如何都会接受代码(他们会接受一些不完整类型的向量),但 C++ 标准不允许这样做。

于 2013-09-26T17:30:05.443 回答
2

您不能直接在单个班级中执行此操作。但是您可以使用CRTP,这是专门针对此类情况的。

您将拥有一个模板基类和一个以它自己的类型为模板的派生类。然后基类可以vector根据派生类自由定义其他泛型(如 a )。下面的示例代码:

#include <vector>
using namespace std;

template <typename Derived>
class Base{
    vector<Derived> nodes;
public:
    void TestInsert(const Derived& der){
        nodes.push_back(der);
    }
    void TestPrintSize(){
        printf("NUM %d\n", nodes.size());
    }
};

class Derived1 : public Base<Derived1>{};

int main(){
    Derived1 der1, der2;
    der2.TestInsert(der1);
    der2.TestPrintSize();
}
于 2013-09-26T17:50:48.357 回答
0

是的,您可以通过使用指针或引入辅助类:

class NodeVector;

class Node {
  private:
    string ID;
    NodeVector *vect;

  public:
    Node() : vect(new NodeVector) { }
    // Don't forget other constructors & destructor because you allocate vect
};

class NodeVector {
  public:
    std::list< Node >;
};
于 2013-09-26T17:38:51.207 回答
0

正如杰瑞所说。你不能。

这不一样

class node {
    int data;
    node *next;
}

使用 node *,编译器只需要知道指针的大小。但是vector<T>编译器需要知道你的类的大小,T直到类定义结束才定义。

于 2013-09-26T17:39:52.923 回答