使用子C++从另一个函数调用父函数

Calling parent function from another function using child C++

本文关键字:函数调用 函数 另一个 C++      更新时间:2024-09-29

所以我有一个父类,它是:

class Node
{
public:
Node();
void setParentNode(Node* parent) {this->parentNode = parent;}
Node* getParentNode() {return this->parentNode;}
std::vector<Node> getChildNodes(){return this->childNodes;}
void addChildNode(Node* node);
void removeNode();
private:
std::vector<Node*> childNodes;
Node* parentNode = nullptr;
};

还有一个继承自该类的孩子:

class Cube : public Node
{
public:
Cube();
};

现在我有了另一个文件,它有一个使用子类的函数:

#include "cube.h"
void addCubes(){
Cube mainCube;
for(int i = 0; i < 10; i++){
Cube c;
mainCube.addChildNode(c);
}
}

问题是mainCube没有看到父级具有的addChildNode函数。如果不能使用子类从其他地方访问父函数,那么从另一个类继承有什么意义?

否,父类公共函数可以从子对象调用。然而,该功能的原型是

void Node::addChildNode(Node node);

所以它取了一个CCD_ 1对象&而不是CCD_ 2对象。因此,编译器找不到一个接受CCD_ 3对象&从而产生误差。

修复方法是在声明/定义函数时使用指向Node的指针或指向Node的引用。

所以你的功能应该是

void addChildNode(Node & node);

在这种情况下,Node对象可以被传递给函数&编译器会找到它。

最好有

// if you aren't looking to modify the passed object inside addChildNode
void addChildNode(const Node & node); 

以下内容很好&因此,该功能将在中工作

Cube b;   
Node &a = b;

Node * pn = &b;

如果保持函数的签名对齐,派生类应该能够看到addChildNode函数。这不是什么大问题。然而,还有更多的";严重的";代码问题:

  1. 您需要使基类的析构函数成为虚拟的,以避免一些未定义的行为。

  2. 您必须仔细设计节点的所有权。我想您希望Node类拥有并管理其子节点。这意味着函数addChildNode实际上拥有传入节点对象的所有权,并且在销毁过程中也应该删除它。

  3. 在函数addCubes()中,有一个循环不断调用addChildNode函数,但传递了局部变量Node0,该变量将超出范围并在循环后被销毁。因此,父对象mainCube将保存指向已销毁对象的指针,这将导致崩溃。

修复所有这些问题后,您的代码如下所示:

class Node
{
public:
Node() {};
virtual ~Node() {
for(auto n: childNodes) delete n;
};
void setParentNode(Node* parent) {this->parentNode = parent;}
Node* getParentNode() {return this->parentNode;}
std::vector<Node*> getChildNodes(){return this->childNodes;}
void addChildNode(Node* node) {
childNodes.push_back(node);
};
void removeNode();
private:
std::vector<Node*> childNodes;
Node* parentNode = nullptr;
};
class Cube : public Node
{
public:
Cube() {};
};
void addCubes(){
Cube mainCube;
for(int i = 0; i < 10; i++){
Cube *c = new Cube();
mainCube.addChildNode(c);
}
}

最好使用智能指针来管理内存,代码更优雅、更容易阅读,而且更难出错:-(。

#include <memory>
class Node
{
public:
Node() {};
virtual ~Node() {};
void setParentNode(Node* parent) {this->parentNode = parent;}
Node* getParentNode() {return this->parentNode;}
std::vector<std::shared_ptr<Node>>& getChildNodes(){return this->childNodes;}
void addChildNode(std::shared_ptr<Node> node) {
childNodes.push_back(std::move(node));
};
void removeNode();
private:
// childNodes own elements in it, they will be deleted automatically.
std::vector<std::shared_ptr<Node>> childNodes;
Node* parentNode = nullptr;
};
class Cube: public Node
{
public:
Cube() {};
};
void addCubes(){
Cube mainCube;
for(int i = 0; i < 10; i++){
auto c = std::make_unique<Cube>();
mainCube.addChildNode(std::move(c));
}
}

假设您已经共享了代码的整个实现。您还没有定义函数addChildNode的主体,类似于setParentNode等。您需要在该函数中执行类似childNodes.push_back(node);的操作。

注意:还需要将输入传递给addChildNode,如@user93353的回答所示。此外,将childNodes定义为std::vector<Node *>,以避免对象切片。