当前位置: 首页 > 知识库问答 >
问题:

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

诸葛雨泽
2023-03-14
#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类中获取数据提供程序类providerData_。

为了解决这种情况,我认为下面是一个解决方案。我制作了如下的singleton数据传输类。但我不确定这是不是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个答案

沈伟
2023-03-14

软件体系结构中有三种模式,称为聚合、组合和关联。

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

数据消费者有一个指向数据提供者的指针:

// 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 之外分配/创建,并且是独立的。

阅读这个答案和这个答案,以更好地解释这些模式。

宇文德明
2023-03-14

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

 类似资料:
  • 问题内容: 我正在将AngularJS与c#mvc一起使用。我有一个主页,用户可以在其中输入一些数据,并将其传递给第二个模块,在该模块中,我将使用这些数据进行处理和决策。我必须使用第二个模块中第一个模块中输入或更新的数据。有人可以帮我实现这个目标吗? 问题答案: 希望以下实现可以帮助您有所了解。

  • 我正在努力理解使用的好处。文档和其他帖子(Junit@Rule是如何工作的?)所有这些都暗指能够在类内的测试之间共享代码和/或在测试类之间共享代码。 在功能/集成测试中,我试图使用进行DB连接,但我不知道如何跨类共享该连接。事实上,在这种情况下,我并没有看到比有什么好处。我是不是用错了,还是我遗漏了什么?

  • 问题内容: 我在JVM(Scala)中构建了一个庞大的图形,我想反复使用它来调整算法。我不想每次都从磁盘重新加载它。有没有办法让它坐在一个JVM中,而又与另一个正在开发算法的JVM连接呢? 问题答案: 将图形保存到磁盘,然后使用MappedByteBuffer将其映射到内存。两个进程应使用相同的内存,该内存将与页面缓存共享。

  • 一周前,我开始建立一个WooCommerce商店,它应该可以选择在两个客户之间共享订单。这是我为您制作的一个小图表,您可以理解它应该是什么样子(请看一看): 这就是我一步一步做的 用户B单击一个按钮- 用户B单击另一个按钮- 这两个步骤(显示和隐藏用户B的订单)工作正常——我已经测试过了。字段设置和取消设置。 现在情况越来越糟: 我已经搜索了很多,并要求一些人找到WooCommerce中的功能,该

  • 问题内容: 在Java中的各个类之间共享数据的最佳方法是什么?我有一堆变量,它们由不同的类以不同的方式在不同的文件中使用。让我尝试说明问题的简化版本: 这是我之前的代码: 现在看起来像这样: 所以无论如何,我应该每次都传递x和y(其中x,y是存储在辅助类func中的变量)吗? 我的想法是要有一个特殊的容器类,其中存放x和y。顶级类将具有容器类的实例,并使用set方法更改x,y。 我的帮助程序类还将