【问题标题】:Array of objects inside a class类中的对象数组
【发布时间】:2013-11-26 15:02:23
【问题描述】:

所以,我有两个类:Node 和 Graph。在 Graph 类的私有部分我声明:

int size;
Node* n;

在 Graph 构造函数中,我正在尝试创建一个动态数组:

size=1;

Node *n = new Node[size];

但我收到一个错误:“访问冲突读取位置 0xcccccd44”。我该如何解决?我知道我一定是对数组做错了,但我不知道要修复什么以及如何修复它。

类图:

class Graph {
    friend class Node;

    private:
        int size;
        Node* n;

    public:
        Graph();
        Graph(int, Vertex*);
        ~Graph();
        void Draw(RenderWindow &);
        void Update(RenderWindow &, GameObject &, bool);
};

还有两个构造函数:

Graph::Graph() {
    size=1;

    Node *n = new Node[size];
}

Graph::Graph(int s, Vertex p[]) {
    size=s;
    Node *n = new Node[size];
    for (int i=0; i<size; i++) {
        n[i].setNumer(i);
        n[i].setX(p[i].getX());
        n[i].setY(p[i].getY());
    }
}

【问题讨论】:

  • 你需要发布更多代码,但我猜你没有关注the rule of three
  • 嗯,这里真的没有太多代码可以添加了...我将代码放在第一篇文章中。
  • 你的意思是初始化成员n,而不是声明一个同名的局部变量?为什么不使用std::vector&lt;Node&gt; 来避免手动处理指针时遇到的所有问题?
  • 不应该是n = new Node[size];,你隐藏了你的成员变量n
  • 无论如何都要使用std::vector

标签: c++ arrays class dynamic


【解决方案1】:

您正在构造函数中重新声明n。你用size 做对了,但用n 做错了。像这样

Graph::Graph(int s, Vertex p[]) {
    size=s;
    n = new Node[size];
    for (int i=0; i<size; i++) {
        n[i].setNumer(i);
        n[i].setX(p[i].getX());
        n[i].setY(p[i].getY());
    }
}

在您的版本中,您正在初始化一个名为 n 的局部变量,它与您的类中声明的 n 不同。

【讨论】:

    【解决方案2】:

    正如我在您发布其余代码之前在评论中提到的那样,您在此处隐藏了您的成员变量 n

    Node *n = new Node[size];
    ^^^^^^^
    

    这声明了一个新的自动变量n,在你离开你的构造函数后它就不会存在并且还会泄漏内存,只要把它改成这样:

    n = new Node[size];
    

    正如其他人已经提到的那样,使用std::vector 会更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2011-09-29
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多