如何从包含的类中执行函数

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 大写字母之间是否存在拼写错误?如果此处未显示的代码有问题,则很难注意到(编译器除外)问题的根源。 我知道当mainClassSubClass 的成员变量时它会起作用。所以我只需要按照我猜的正确顺序包含文件。让我再过一遍。 @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() 写入包含您想要的内容的另一个文件中。

以上是关于如何从包含的类中执行函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从基类中的函数调用重载函数?

OpenGL 帧缓冲函数不能在单独的类中完全工作

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样

当我的类中有属性具有默认构造函数来提供值自动映射器时,如何映射?

在继承的类中启动线程

C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数