返回类型为

时间:2017-05-25 13:07:43

标签: c++

方法" DataOperation"必须返回DataResponse类型的值。

我的异步请求 - 回复中有一个回调函数" LoadDataReply"其中我在收到的回复中应用了一些业务逻辑并返回到main方法(我不确定返回回调是否正确)。

你们可以帮我解决如何返回LoadData方法调用者的值。

DataResponse DataOperation::LoadData(const RequestType request)
{
DataResponse dataResponse;
messageAssistant.AsyncRequest("LoadDataList", request)
    .OnReply<MyResponseType>("LoadDataListReply", [this, &dataResponse](auto& reply) { dataResponse = this->LoadDataFromResponse(reply); });

return dataResponse;
}

DataResponse DataOperation::LoadDataFromResponse(const MyResponseType& reply)
{
   ///Doing some operation with reply data
   DataResponse dataResponse;
   dataResponse.Data = reply.Data();
   return dataResponse;
}

上面的代码没有编译。

我收到编译错误,

error C4716: 'DataOperation::LoadData': must return a value

注意: - 我已更新了我的代码并正在编译而没有任何问题。但是我从LoadData返回的dataResponse对象没有在LoadDataFromResponse中更新值。它有初始值。

我如何确保它返回更新的值而不是初始值?

2 个答案:

答案 0 :(得分:0)

使用处理程序。您可以创建Handler(每个线程都可以访问的消息列表)。看下面的pseodocode:

class Handler {
 public:
  Handler();
  // Constructor
  ~Handler();
  // Destructor
  void pushmessage ( DataResponse* p );
  DataResponse* popmessage();
  bool empty();
protected:
  vector<DataResponse*> pool;
  RTTICriticalSection CS;
};

Handler::Handler()
{
  CS = CreateCriticalSection;
}

Handler::~Handler()
{
  DeleteCriticalSection(CS);
}

void Handler::pushmessage ( DataResponse* p )
{
  EnterCriticalSection(CS);
  try {
    pool.push_back(p)
  } catch(...){
    //
  }
  LeaveCriticalSection(CS);
}

DataResponse* Handler::popmessage() {
  DataResponse* dr = null;
  EnterCriticalSection(CS);
  try {
    dr = pool.back();
    pool.pop_back();
  } catch(...){
    //
  }
  LeaveCriticalSection(CS);    
  return dr;
}

bool Handler::empty() {
  bool res = true;
  EnterCriticalSection(CS);
  try {
    res = pool.empty();
  } catch(...){
    //
  }
  LeaveCriticalSection(CS);    
  return res;      
}

DataResponse DataOperation::LoadData(const RequestType request)
{
   messageAssistant.AsyncRequest("LoadDataList", request)
    .OnReply<MyResponseType>("LoadDataListReply", [this](auto& reply) {  this->LoadDataFromResponse(reply); });  
}

/*DataResponse* */ void DataOperation::LoadDataFromResponse(const MyResponseType& reply)
{
   ///Doing some operation with reply data
   DataResponse* dataResponse = new DataResponse();
   dataResponse.Data = reply.Data();
   handler.pushmessage( dataResponse );
   //return dataResponse;
}

//call this sub somewhere inside the idle cycle synchronized with the main thread
void proceedMessages() {
  while (!handler.empty())
  {
    DataResponse* dr = handler.popmessage();
    //do something with dr
    //free dr
  }
}

答案 1 :(得分:0)

这已通过使用回调修复。