我有真实的消息类,例如
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/