我有真正的消息类,例如
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* 。