在c ++中,如何有效地在两个类之间共享数据?

时间:2019-03-14 14:18:33

标签: c++ design-patterns data-transfer data-transfer-objects

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

有两个类。 我想在dataConsumer类中获取dataProvider类的providerData _。

为解决这种情况,我认为以下是一种解决方案。 我做了如下的单例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 个答案:

答案 0 :(得分:1)

如果两个类都需要能够获取并设置providerData_,我将创建第三个Data类来拥有providerData_。 然后,我可以将Data类的指针提供给所有需要访问该数据的类。

答案 1 :(得分:0)

软件体系结构中有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之外分配/创建,并且是独立的。

阅读this answerthis answer以获得关于这些模式的更好解释。