class Vertex {
public:
Vertex* previous_vertex_id;
Vertex::Vertex() {}
Vertex::~Vertex() {}
}
现在它编译了,但我需要严格 previous_vertex_id 而不使用指针,它是用于进一步代码的,它使用了这个属性。我怎样才能做到这一点?
答案 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;
在私人部分。不要使用*