【问题标题】:In c++, How can I share data between two classes efficiently?在 C++ 中,如何有效地在两个类之间共享数据?
【发布时间】:2019-08-05 11:39:23
【问题描述】:
#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


    【解决方案1】:

    在软件架构中有 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 以获得对这些模式的更好解释。

    【讨论】:

    • 感谢您的回答,能否让我知道我想知道我的解决方案(=dataTransfer 单例类)是否可用?
    • 如果可用,您的意思是“它会起作用”,那么是的,您的解决方案将起作用。但是这里没有必要使用单例,在复杂的程序上只会使事情复杂化并创建更多problems
    • 牢记单一责任原则。 DataProvider(根据他的名字)在这里提供数据。在您的示例中,提供数据的责任在 DataProvider 和 DataTransfer 之间是不必要的。假设将来有人想将共享的数据类型从 int 更改为 MyDataType 类,您必须更改 2 个类(如果两个类都没有相应更改,可能很难找到错误)。
    • 感谢您的友好建议。但是如果我由于某种原因添加了一个限制条件(=dataConsumer 类不能直接使用 dataProvider 类),这种情况还有其他解决方案吗?
    • 有无数种编写代码的方法可以解决您的问题。问题是哪一个是最好的(即开发和维护不太复杂)的解决方案。这取决于 DataConsumer 无法使用 DataProvider 的原因。如果是因为你使用了一个无法修改的库,那么你可以创建一个包装器来做任何你想做的事情。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多