В c ++, как я могу эффективно обмениваться данными между двумя классами? - PullRequest
0 голосов
/ 14 марта 2019
#include "dataConsumer.h"

#include <iostream>
#include <Windows.h>

DataConsumer::DataConsumer(){}
DataConsumer::~DataConsumer(){}

void DataConsumer::Body()
{
    std::cout << "DataConsumer Start" << std::endl;

    while (1)
    {
        //I want to get providerData_ of DataProvide class in here

        Sleep(1000);
    }
}


#include "dataProvider.h"

#include <iostream>
#include <Windows.h>

DataProvider::DataProvider(){}
DataProvider::~DataProvider(){}

void DataProvider::Body()
{
    std::cout << "DataProvider Start" << std::endl;

    while (1)
    {
        //Update data in here
        providerData_++;

        Sleep(1000);
    }
}

Есть два класса. И я хочу получить providerData_ класса dataProvider в классе dataConsumer.

Чтобы разрешить эту ситуацию, я подумал, что одно из следующих решений. Я сделал синглтон dataTransfer класс, как показано ниже. Но я не уверен, является ли это общим решением в c ++. Прежде всего, я хочу знать, доступно ли мое решение. Далее, если вы знаете лучшее решение (или шаблон проектирования) для разрешения моей ситуации, пожалуйста, сообщите мне.

#ifndef DATATRANSFER_H
#define DATATRANSFER_H

class DataTransfer
{
public:
    static DataTransfer* getInstance()
    {
        static DataTransfer instance;
        return &instance;
    }
    void GetData(unsigned int *data)
    { 
        if(data)
            *data = data_;
    }
    void SetData(unsigned int *data)
    { 
        if(data)
            data_ = *data;
    }

private:
    DataTransfer(){}
    ~DataTransfer(){}

    unsigned int data_;
};

#endif


#include "dataConsumer.h"
#include "dataTransfer.h"

#include 
#include 

DataConsumer::DataConsumer(){}
DataConsumer::~DataConsumer(){}

void DataConsumer::Body()
{
    unsigned int data = 0;
    std::cout << "DataConsumer Start" << std::endl;

    while (1)
    {
        //I want to get providerData_ of DataProvide class in here
        DataTransfer::getInstance()->GetData(&data);

        std::cout << "DataConsumer data:" << data << std::endl;

        Sleep(1000);
    }
}

#include "dataProvider.h"
#include "dataTransfer.h"

#include 
#include 

DataProvider::DataProvider() : providerData_(0)
{
}

DataProvider::~DataProvider(){}

void DataProvider::Body()
{
    std::cout << "DataProvider Start" << std::endl;

    while (1)
    {
        //Update data in here
        providerData_++;

        DataTransfer::getInstance()->SetData(&providerData_);

        Sleep(1000);
    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Если оба класса должны иметь возможность получить и установить providerData_, я бы создал третий класс Data, которому будет принадлежать providerData_. Затем я мог бы дать указатель класса Data на все классы, которым необходим доступ к этим данным.

0 голосов
/ 14 марта 2019

В архитектуре программного обеспечения есть 3 шаблона, называемых агрегацией, композицией и ассоциацией.

Шаблон, в котором класс Foo может использовать класс Bar, но не "владеет" им, и оба класса остаются независимыми.

DataConsumer имеет указатель на DataProvider:

// Association 
class DataConsumer{
 private:
  DataProvider* provider;
 public:   
  void setProvider(DataProvider* p) { provider = p; }
  void Body();
  int /* or whatever data type */ getData() 
  {
      if(provider != nullptr) 
      {
          return provider->getData();
      } 
      else 
      {
          // handle provider not being set
          return ...;
      }
  }
};

DataProvider должен быть размещен / создан вне DataConsumer и является независимым.

Прочитайте этот ответ и этот ответ для лучшего объяснения этой схемы.

...