如何最好地处理C++;需要具有自类型对象的类? 我是C++初学者,有其他编程语言的经验(Python,JavaScript)。 我有几个关于“递归”类的问题——在C++中声明的类—— 问题1

如何最好地处理C++;需要具有自类型对象的类? 我是C++初学者,有其他编程语言的经验(Python,JavaScript)。 我有几个关于“递归”类的问题——在C++中声明的类—— 问题1,c++,class,oop,C++,Class,Oop,对于一个具有构造函数的类,我理解在其内部声明它会导致其声明不完整,因此编译器无法计算其对象的大小。 到目前为止,我了解到类声明只能包含指向self-type的指针或self-type的静态对象。 然而,我不明白这两种方法的好处是什么?我的目标是使用一个类似于树结构/网络的类,其中每个节点存储其父节点和子节点 问题2 父节点和子节点都将使用类函数进行设置。如何在同一类的函数中声明自类型?我是否也使用静态指针或指针?在这种情况下,如何正确初始化 example.cpp #包括“Point.hpp”

对于一个具有构造函数的类,我理解在其内部声明它会导致其声明不完整,因此编译器无法计算其对象的大小。 到目前为止,我了解到类声明只能包含指向self-type的指针或self-type的静态对象。 然而,我不明白这两种方法的好处是什么?我的目标是使用一个类似于树结构/网络的类,其中每个节点存储其父节点和子节点

问题2 父节点和子节点都将使用类函数进行设置。如何在同一类的函数中声明自类型?我是否也使用静态指针或指针?在这种情况下,如何正确初始化

example.cpp
#包括“Point.hpp”
类节点{
//节点父节点;//错误
//选项1:指针
节点*父节点;
//备选案文2:静态
静态节点父节点;
媒介儿童;
公众:
节点(浮点x,浮点y,浮点z);
void setChildren(/*一些参数*/);
浮动x,y,z;
};
示例.hpp
Node::Node(浮点x,浮点y,浮点z){
x=x;
y=_y;
z=z;
}
void Node::setChildren(/*某些参数*/){
节点child1,child2;//错误:如何在此处声明?
//用参数做一些事情。。。
child1={/*x1,y1,z1*/};//错误:如何初始化?
child2={/*x2,y2,z2*/};//错误:如何初始化?
儿童。推回(儿童1);
儿童。推回(儿童2)
我希望有人能给我解释一下!我真的迷路了


谢谢!非常感谢您的帮助。

您的声明和定义在错误的文件中。类声明应在头文件(.hpp)中,函数/构造函数等定义应在源文件(.cpp)中。您需要在源文件中包含头文件,如下所示:

示例.hpp 设置父指针的一种方法是向
节点
类添加一个新的
push_back
函数,以便在将新的子对象添加到
子对象
列表之前/之后在其上设置指针

也可以在C++中像这样初始化子1/2。< /P>

Node child1 = {x1, y1, z1};
Node child2 = {x2, y2, z2};
“然而,我不明白这两种方法的好处是什么?” <>在C++中,你的成员函数中始终有<代码>这个< /Cult>指针,这意味着不需要像其他编程语言<代码】那样的<代码>“自我/代码>指针”。 另外,如果您正在规划我看到的您正在规划的内容,为了使其正常工作,您不希望对
子对象使用
向量
,因为
向量
使用连续内存,一旦
向量
的内部内存调整大小,这将使指向它的所有指针/迭代器无效(可能发生在
push_back
和其他操作上,如擦除/插入)。这意味着在这种情况下,更简单的方法是使用
列表而不是
向量
。这样,当添加/删除新的子对象时(例如
push_back
),父返回指针不会失效

请参阅std::vector和std::list的文档


您的声明和定义在错误的文件中。类声明应在头文件(.hpp)中,函数/构造函数等定义应在源文件(.cpp)中。您需要在源文件中包含头文件,如下所示:

示例.hpp 设置父指针的一种方法是向
节点
类添加一个新的
push_back
函数,以便在将新的子对象添加到
子对象
列表之前/之后在其上设置指针

也可以在C++中像这样初始化子1/2。< /P>

Node child1 = {x1, y1, z1};
Node child2 = {x2, y2, z2};
“然而,我不明白这两种方法的好处是什么?” <>在C++中,你的成员函数中始终有<代码>这个< /Cult>指针,这意味着不需要像其他编程语言<代码】那样的<代码>“自我/代码>指针”。 另外,如果您正在规划我看到的您正在规划的内容,为了使其正常工作,您不希望对
子对象使用
向量
,因为
向量
使用连续内存,一旦
向量
的内部内存调整大小,这将使指向它的所有指针/迭代器无效(可能发生在
push_back
和其他操作上,如擦除/插入)。这意味着在这种情况下,更简单的方法是使用
列表而不是
向量
。这样,当添加/删除新的子对象时(例如
push_back
),父返回指针不会失效

请参阅std::vector和std::list的文档


节点child1;
会出现错误的唯一原因是,您试图默认构造一个没有默认构造函数的对象
static
在这里不起作用。这将导致创建一个与该类的任何特定对象都不关联的对象。这意味着您只有一个父对象,而不是您已经创建了0个、1个或多个其他对象。
class节点{Node parent;};
将是无限大的,因为每个
父对象也将包含一个
父对象
一个数据成员在对象中占据空间。编译器可以计算出大小,它将是无限大的。它甚至不可能是无限大的,因为内部的和外部的必须是相同的大小。想象一个用胶带封住的纸板盒x、 在卡德博亚里面
Node child1 = {x1, y1, z1};
Node child2 = {x2, y2, z2};