如何从包含的类中执行函数
Posted
技术标签:
【中文标题】如何从包含的类中执行函数【英文标题】:How to execute a function out of an included class 【发布时间】:2019-06-04 06:35:53 【问题描述】:我将两个类分开在四个文件中。主类包含一个子类,需要执行它的功能(最小示例代码中未显示)。我要做的是在子类的范围内执行主类的一个功能。
我认为有些想法是继承子类中的函数,但我不知道如何做到这一点。
MainClass.cpp
#include "MainClass.hpp"
void MainClass::mainCallback()
std::cout << "[mainCallback] executed" << std::endl;
void MainClass::subCallback()
std::cout << "[subCallback] executed" << std::endl;
int main()
MainClass mainClass;
mainClass.mainCallback();
SubClass subClass;
subClass.activateSubClass();
return 0;
MainClass.hpp
#pragma once
#include "SubClass.hpp"
#include <iostream>
class MainClass
public:
void mainCallback();
void subCallback();
;
子类.cpp
#include "SubClass.hpp"
void SubClass::activateSubClass()
mainClass.subCallback(); //TODO call this function from this scope
子类.hpp
#pragma once
class SubClass
public:
void activateSubClass();
;
SubClass.cpp中的错误当然是: 错误:使用未声明的标识符“mainClass”
【问题讨论】:
在MainClass
的哪个实例 上您希望mainClass.subCallback();
调用回调?或者您可能不需要 any 实例并且可以进行回调static
?
"未在最小示例代码中显示" 请将其设为 minimal reproducible example。了解文件包含的整个树很重要。此外,在 mainClass 与 MainClass 大写字母之间是否存在拼写错误?如果此处未显示的代码有问题,则很难注意到(编译器除外)问题的根源。
我知道当mainClass
是SubClass
的成员变量时它会起作用。所以我只需要按照我猜的正确顺序包含文件。让我再过一遍。 @Yunnosch 不显示函数的目的只是指出子类必须是子类,不能简单地包含mainClass
不包括,不是成员变量。阅读继承。
不要有“不相关”的代码部分并且不显示它们,请创建一个不需要它们的 MCVE。问题是,这里的提问者经常误判什么是相关的,什么是不相关的......
【参考方案1】:
只是子类的子类:
class SubClass: public MainClass
public:
void activateSubClass();
;
SubClass 的这种(公共)方式使得 MainClass 的所有方法都可以在 SubClass 实例中调用。你也可以私有继承。这样只有 activateSubClass() 是可调用的。
在activateSubClass中可以直接调用父类的方法:
void SubClass::activateSubClass()
mainClass.subCallback(); //TODO call this function from this scope
不要忘记在 SubClass.hpp 中包含 MainClass.hpp
【讨论】:
注意 OP 对问题的评论(应该在这里)。您的答案似乎需要更多解释。强调并突出继承。 感谢您的回答。但是当我这样做时,我会得到循环依赖,对吧?我将MainClass.hpp
包括在SubClass.hpp
中,反之亦然。我收到错误:expected class name
用于继承,因为#pragma once
阻止在SubClass.hpp
中包含MainClass.hpp
好的,我解决了。问题是,SubClass.hpp
仍然包含在`MainClass.hpp 中。现在我可以访问该功能了。感谢大家的帮助!【参考方案2】:
您尝试在没有MainClass
实例的情况下调用MainClass.subCallback()
。在我看来,这是 static
方法的典型用例。
那么,我认为你的 #include
指令是错误的。事实上,MainClass
似乎不需要知道SubClass
,但事实恰恰相反。我认为最好将 MainClass.hpp 包含在 SubClass.hpp 中。这将解决您的圈子依赖性问题。您可以将 main()
函数写入另一个文件。
编辑:示例
MainClass.hpp:
#pragma once
class MainClass
public:
void mainCallback();
static void subCallback(); // mak it static to be able to call it without an instance of the class
;
MainClass.cpp:
#include "MainClass.hpp"
#include <iostream>
void MainClass::mainCallback()
std::cout << "[mainCallback] executed" << std::endl;
void MainClass::subCallback()
std::cout << "[subCallback] executed" << std::endl;
子类.hpp:
#pragma once
class SubClass
public:
void activateSubClass();
;
子类.cpp:
#include "SubClass.hpp"
#include "MainClass.hpp" // MainClass inclusion
void Suclass::activateSubClass()
MainClass::subCallback(); // Call of the static method
main.cpp:
#include "MainClass.hpp"
#include "SubClass.hpp"
int main()
MainClass mc;
mc.mainCallback();
SubClass sc;
sc.activateSubClass(); // Will call MainClass::subCallback()
return 0;
希望对你有帮助。
【讨论】:
感谢您的回答。确实,我对静态方法还不是很了解,我会查找它们。在MainClass.hpp
中包含SubClass.hpp
是必要的,因为有些函数需要这样调用。
@dofrey 我对我的答案进行了编辑,以便给你一个例子。
好吧,但仅关于您显示的代码,MainClass
不需要知道SubClass
。您只需将main()
写入包含您想要的内容的另一个文件中。以上是关于如何从包含的类中执行函数的主要内容,如果未能解决你的问题,请参考以下文章
c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样