私は実際のメッセージクラスを持っています。
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* を削除できるはずです。