使用子C++从另一个函数调用父函数
Calling parent function from another function using child C++
所以我有一个父类,它是:
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
函数。这不是什么大问题。然而,还有更多的";严重的";代码问题:
-
您需要使基类的析构函数成为虚拟的,以避免一些未定义的行为。
-
您必须仔细设计节点的所有权。我想您希望Node类拥有并管理其子节点。这意味着函数
addChildNode
实际上拥有传入节点对象的所有权,并且在销毁过程中也应该删除它。 -
在函数
addCubes()
中,有一个循环不断调用addChildNode
函数,但传递了局部变量Node
0,该变量将超出范围并在循环后被销毁。因此,父对象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 *>
,以避免对象切片。
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 从 Android JNI/NDK 代码中的C++函数调用 C 函数
- 如何从前面定义的另一个函数调用函数模板
- 为什么我们不能从具有默认参数的函数调用函数?
- 从其他函数调用函数或将函数作为数组的参数是一种好做法还是坏做法
- 使用c++中定义的头函数调用函数
- 从FORTRAN代码调用的c++函数调用c++函数
- 从函数调用函数时出错"identifier not found"
- 函数A调用函数B,函数B调用函数A,你怎么称呼它
- 函数A调用函数B,反之亦然(为什么不起作用)
- 当C++函数参数列表中有String类型时,我可以使用C程序函数调用C++函数吗
- 从静态函数调用函数指针
- 从 Objective-C 函数调用C++函数不起作用
- 从c++ /CLI函数调用c#函数