【发布时间】:2020-04-24 12:31:16
【问题描述】:
我是 C++ 初学者,在其他编程语言(即 Python、Javascript)方面有一定经验。 我有几个关于“递归”类的问题——在自己内部声明的类——在 C++ 中。
问题 1
对于具有构造函数的类,我知道在其内部声明它会导致其声明不完整,因此编译器将无法计算出其对象的大小。 到目前为止,我了解到一个类声明只能包含一个指向自我类型的指针或一个自我类型的静态对象。 但是,我不明白这两种方法的好处是什么?我的目标是使用类似于树结构/网络的类,其中每个节点都存储其父节点和子节点!
问题 2
父节点和子节点都将使用类函数进行设置。如何在同一类的函数中声明自我类型?我是否也使用静态或指针?在这种情况下如何正确初始化?
example.cpp
#include "Point.hpp"
class Node {
//Node parent; // ERROR
// Option 1: Pointer
Node * parent;
// Option 2: Static
static Node parent;
vector<Node> children;
public:
Node(float _x, float _y, float _z);
void setChildren(/* some params */);
float x, y, z;
};
example.hpp
Node::Node(float _x, float _y, float _z) {
x = _x;
y = _y;
z = _z;
}
void Node::setChildren(/* some params */) {
Node child1, child2; // ERROR: how to declare here?
// do stuff with the parameters...
child1 = {/*x1, y1, z1*/}; // ERROR: how to initialise?
child2 = {/*x2, y2, z2*/}; // ERROR: how to initialise?
children.push_back(child1);
children.push_back(child2)
我希望有人能给我解释一下!我真的迷路了。
谢谢!非常感谢任何帮助。
【问题讨论】:
-
Node child1;给出错误的唯一原因是因为您试图默认构造一个没有默认构造函数的对象 -
static在这里不起作用。它将导致创建一个不与该类的任何特定对象关联的单个对象。这意味着您将只有一个父对象,无论您创建了 0 个、1 个还是多个其他对象。 -
class Node { Node parent; };会无限大,因为每个parent还包含一个parent -
一个数据成员占用了对象内的空间。编译器可以计算出大小,它将是无限的。
-
它甚至不可能是无限的,因为内层和外层的大小必须相同。想象一个用胶带封口的纸箱,在纸箱里面放着一个花瓶,还有另一个和第一个盒子一样大小的用胶带封口的纸箱。这没有意义。盒子里不能装和自己一样大的东西。