类中具有此类类型的参数

时间:2016-04-03 13:27:36

标签: c++

    class Vertex {

    public:
        Vertex* previous_vertex_id;

        Vertex::Vertex() {}
        Vertex::~Vertex() {}
}

现在它编译了,但我需要严格 previous_vertex_id 而不使用指针,它是用于进一步代码的,它使用了这个属性。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

你不能拥有一个自己作为成员的类,这样一个对象的大小将是无限的。一个Vertex,其中包含Vertex,其中包含Vertex等。

从这个问题和one you posted earlier看来,你想要类似java的东西,但是在C ++中。你想要这样的东西:

class Vertex {

public:
    Vertex* previous_vertex_id;
    ...
    void setPrevious(Vertex &v) {
        previous_vertex_id = &v;
    }

    Vertex &getPrevious() {
        return (*previous_vertex_id); // trusting that the pointer will still be valid.
    }
}

现在,了解在C ++中何时复制对象以及何时引用对象非常重要。使用我刚刚描述的Vertex类:

Vertex v1{}; // construct a new vertex
Vertex v2{}; // construct a new vertex

// v3 is a copy of v1, they are separate objects at different memory locations.
Vertex v3 = v1;

// v4 is a reference to v1, they are the same object under a different name.
Vertex &v4 = v1;

// v1.previous_vertex_id is a pointer to v2.
v1.setPrevious(v2);

// v5 is a copy of v2. A different object at a different memory location.
Vertex v5 = v1.getPrevious();

// v6 is a reference to v2, they are the same object under a different name.
Vertex &v6 = v1.getPrevious();

现在您可以使用getPrevious作为非指针访问前一个顶点。请注意分配它的方式,因此您只能在预期时进行复制(v5 / v6示例)。

答案 1 :(得分:-3)

写一下

Vertex previous_vertex_id; 

在私人部分。不要使用*