Как выполнить функцию из включенного класса - PullRequest
1 голос
/ 04 июня 2019

Я получил два класса, разделенных на четыре файла.Основной класс включает подкласс и должен выполнять его функции (не показано в минимальном примере кода).Я хочу выполнить функцию основного класса в области действия подкласса.

Я думаю, что некоторые идеи заключаются в том, чтобы наследовать функции в подклассе, но я не мог понять, как это сделать.this.

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();
};

SubClass.cpp

#include "SubClass.hpp"

void SubClass::activateSubClass(){
 mainClass.subCallback(); //TODO call this function from this scope
}

SubClass.hpp

#pragma once

class SubClass{
 public:
  void activateSubClass();
};

Ошибка в SubClass.cpp, конечно: error: использование необъявленного идентификатора 'mainClass'

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Вы пытаетесь вызвать MainClass.subCallback() без экземпляра MainClass. По моему мнению, это типичный вариант использования 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;
}

SubClass.hpp

#pragma once
class SubClass
{
   public:
      void activateSubClass();
};

SubClass.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;
}

Надеюсь, это поможет вам.

0 голосов
/ 04 июня 2019

Просто создайте подкласс для подкласса:

class SubClass: public MainClass {
 public:
  void activateSubClass();
};

Таким (публичным) способом Подкласс делает все методы MainClass вызываемыми в экземплярах Подкласса.Вы также можете частное наследование.Таким образом, только activSubClass () будет вызываться.

В activSubClass вы можете напрямую вызывать методы родительского класса:

void SubClass::activateSubClass(){
 mainClass.subCallback(); //TODO call this function from this scope
}

Не забудьте включить MainClass.hpp в SubClass.hpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...