我有真实的消息类,例如

class Specific1Message {
   //various functions to get different types of data
};

class Specific2Message {
   //various functions to get different types of data
};

我无法改变。

我正在重新编写一个对这些消息进行编码和解码的软件工具。它决定在运行时对哪些消息进行解码/编码。

从文本文件中检索了特定消息的负载,然后将其重播以模仿真实的系统。消息被临时存储在std::list中。为了使新/删除生命周期更加健壮,有人要求我使用智能指针。

我对消息的第一个想法是做这样的事情:
class proto_msg : public ref_type {
 public:


}

//ref_type是一个智能指针类
class Specific1msg : public proto_msg {
   public:


  Specific1Message m_msg;  //instance of specific 1 message - composition
};

但是我的工具中有一些函数,该函数需要一个proto_msg *作为参数。所以我在想进入Specific1Message(例如),我会这样做:
int SpecificMessageHandler::EncodeMsg(proto_msg* msg, unsigned char* buffer, int size)

但是,然后如何检索Specific1Message? msg-> GetMsg()-但是如何定义此方法?它会返回什么?

我需要在基类中定义GetMsg()。但是返回类型是什么?那是我无法理解的吗?也许我需要重新考虑。

编辑
感谢您的所有答复。我了解了其他方面的多重调度。

最后,我决定这样做:-
class realproto {
public:
   const char* getName() const { return "realproto"; }
};

class real2ndproto {
public:
   const char* get2Name() const { return "real2ndproto"; }
};


template<typename T>
class ProtoWrapper : public ref_type {
public:
   ProtoWrapper(T* real) : m_msg(real) {}
   ~ProtoWrapper() { delete m_msg; }  //cannot have smart ptr on real_proto - so do this way

   T* getMsg() { return m_msg; }

private:
   T* m_msg;
};

然后像这样打电话
  ref_ptr<ProtoWrapper <realproto> > msg2 = new ProtoWrapper<realproto>(new realproto);

  realproto* pr1 = msg2->getMsg(); //if need underlying protocol

希望这可以使我以最少的代码更改来删除void *。

最佳答案

我唯一能想到的选择是模板+双重调度

class proto_msg : public  ref_type{
   public:
      virtual int call_encode (SpecificMessageHandler*, unsigned char* buffer, int size) = 0;
};

template <class M>
class SpecificMesssageTpl : public  proto_msg
 {
   public:
      int call_encode (SpecificMessageHandler* handler, unsigned char* buffer, int size)
      {
          return handler->EncodeMsgSpecific (m_msg, buffer, size);
      }

private:
  M m_msg;  //instance of specific 1 message - composition
};


class SpecificMessageHandler
{
public:
    int SpecificMessageHandler::EncodeMsg(proto_msg* msg, unsigned char* buffer, int size)
   {
        return msg->call_encoder (this, buffer, size);
   }

   int SpecificMessageHandler::EncodeMsgSpecific(Specific1Message * msg, unsigned char* buffer, int size)
   {
    // encode Specific1Message
   }

   int SpecificMessageHandler::EncodeMsgSpecific(Specific2Message * msg, unsigned char* buffer, int size)
   {
     // encode Specific2Message
   }
};

关于c++ - 替换为空*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13294197/

10-11 22:47