• Saída esperada:

    Processing Queue...
    Hey, this is DataHub!
     I have a message for you: C++ é legal!
  • É possível se livrar da função attachDataHub e passar o ponteiro da classe diretamente no construtor.

    #include <iostream>
    
    class BaseDataHub
    {
    public:
      void print(std::string msg) const {
        std::cout << "Hey, this is DataHub!" << std::endl;
        std::cout << " I have a message for you: " << msg << std::endl;
      }
    };
    
    class BaseQueueManager
    {
    private:
      BaseDataHub* mDataHubPtr; // Queue manager tem um ponteiro para o datahub
    
    public:
      BaseQueueManager(BaseDataHub* datahub) { mDataHubPtr = datahub; }
      void ProcessQueue() {   // Função que acessa membros do DataHub através do seu ponteiro
        std::cout << "Processing Queue..." << std::endl;
        mDataHubPtr->print("C++ é legal! ");
      }
    };
    
    class DerivedCPDigiMain: public BaseDataHub, public BaseQueueManager
    {
    public:
      DerivedCPDigiMain(int value): BaseQueueManager(this) {}
    };
    
    int main() {
     DerivedCPDigiMain cpdigi(6);
     cpdigi.ProcessQueue();
    return 0;
    }

    Por acaso acabei testando algo que não esperava que funcionaria, mas funcionou mesmo sem atribuir explicitamente o ponteiro para o datahub, dispensando a definição de um construtor para o QueueManager. Não sei se é uma definição do C++ ou alguma funcionalidade do compilador g++.

    #include <iostream>
    
    class BaseDataHub
    {
    public:
      void print(std::string msg) const {
        std::cout << "Hey, this is DataHub!!!" << std::endl;
        std::cout << " I have a message for you: " << msg << std::endl;
      }
    };
    
    class BaseQueueManager
    {
    private:
      BaseDataHub* mDataHubPtr; // Queue manager tem um ponteiro para o datahub
    
    public:
      void ProcessQueue() {   // Função que acessa membros do DataHub através do seu ponteiro
        std::cout << "Processing Queue..." << std::endl;
        mDataHubPtr->print("C++ é legal! ");
      }
    };
    
    class DerivedCPDigiMain: public BaseDataHub, public BaseQueueManager
    {
    };
    
    int main() {
     DerivedCPDigiMain cpdigi;
     cpdigi.ProcessQueue();
    return 0;
    }
    
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment