如何最好地处理需要有self类型对象的C++类?

我是C++的初学者,有一些其他编程语言(如Python、Javascript)的经验。我有几个关于C++中的 “递归 “类(在自己内部声明的类)的问题。

问题1:我有几个关于C++中的 “递归 “类–在自己内部声明的类–的问题。

对于一个带构造函数的类,我理解为在自身内部声明它,会导致它的声明不完整,因此编译器将无法计算出其对象的大小。自类型指针自类型静态对象.然而,我不明白什么是…… 效益 是对任何一种方法?我的目标是使用一个类似于树状结构网络的类,每个节点都存储它的父节点和子节点。

问题2

父节点和子节点都会用类函数来设置。如何在同一个类的函数中声明自类型?我也用静态还是指针?在这种情况下如何正确初始化?

例子.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;
};

例子.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)

我希望有人能给我解释一下! 我在这里真的很迷茫。

谢谢!任何帮助都是非常感激的。任何帮助都是非常感激的。

解决方案:

你的声明和定义放在了错误的文件中。类的声明应该在头文件(.hpp)中,函数构造函数等定义应该在源文件(.cpp)中。你需要将头文件包含在源文件中,像这样。

example.hpp

#include "Point.hpp"

class Node {
    // Use Option 1: Pointer
    Node* parent = nullptr;

    list<Node> children;

public:
    Node(float _x, float _y, float _z);
    void setChildren(/* some params */);

    float x, y, z;
};

例子.cpp

#include "example.hpp"

Node::Node(float _x, float _y, float _z) {
    x = _x;
    y = _y;
    z = _z;
}

void Node::setChildren(/* some params */) {
    Node child1 = {x1, y1, z1};
    Node child2 = {x2, y2, z2};

    // do stuff with the parameters...

    push_back(child1);
    push_back(child2);
}

设置父指针的一种方法是在一个新的 push_back 的功能。Node 类,以便在将新的子对象添加到子对象之前或之后将其指针设置为 children 列表。

另外你在C++中也是这样初始化child12的。

Node child1 = {x1, y1, z1};
Node child2 = {x2, y2, z2};

“然而,我不明白这两种方法的好处是什么?”

在C++中,你有 this 指针,这意味着在你的成员函数中,不需要使用 self 指针,就像你在其他编程语言中那样。this 是你 self 指针。

另外,如果你的计划和我所看到的一样,为了让这个计划成功,你不会想要使用 vector 对于 children作为 vector 使用了连续内存,一旦内部内存到了 vector 被调整大小(可能发生在 push_back 和其他操作,即擦写)。) 意思是说,比较容易做的事情是用一个 list 而非 vector 在这种情况下。这样一来,当一个新的子代被添加removed时,父代的反向指针就不会失效了(用 push_back 例如)。)

参见std::vector和std::list的文档。

https:/en.cppreference.comwcppcontainervector)。https:/en.cppreference.comwcppcontainerlist。

给TA打赏
共{{data.count}}人
人已打赏
未分类

自定义矩阵标题

2022-9-9 4:35:20

未分类

通过骆驼将 sftp 移至 AWS 后,在 sftp 上的连接出现问题。

2022-9-9 4:35:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索