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

问题描述 投票:1回答:2
#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);
    }
}
c++ design-patterns data-transfer data-transfer-objects
2个回答
1
投票

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


0
投票

在软件架构中有3种模式称为聚合,组合和关联。

Foo可以使用类Bar但不“拥有”它并且两个类保持独立的模式是Association。

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以获得有关这些模式的更好解释。

© www.soinside.com 2019 - 2024. All rights reserved.