0

互いに相互作用するネイティブオブジェクトがいくつかあります。
ここで、これらのオブジェクトの一部をマネージ クラスにラップしました。しかし、ネイティブのラップされたオブジェクトを取得しなければならない場合があります。

たとえば、次のオブジェクトを取り上げます。

これは、Sessions オブジェクトを作成するネイティブ クラスです。

private class SessionFactory : public ISessionFactory {
  public:
    ~SessionFactory() {};
    SessionFactory(MessageEventHandler* handler) : m_handler(handler) {};

    /// Creates an instance of a Session,
    /// using the given message handler.
    inline Session* createSession(const IMessageDispatcher* dispatcher) {
      Session* s = new Session(dispatcher);
      s->AddMsgHandler( m_handler );
      return s;
    };

  private:
    MessageEventHandler* m_handler;
};

これは、ネイティブ MessageEventHandler オブジェクトをラップするマネージ クラスです。

public ref class NetMessageEventHandler {
  public:      
    NetMessageEventHandler() {
      m_NativeHandlerPtr = new MessageEventHandler();
    }

    const MessageEventHandler* GetNativeObject() const;

  private:
    MessageEventHandler* m_NativeHandlerPtr;
};

さて、次の NetMessageDispatcher では、前のそれぞれとやり取りする必要があります。

public ref class NetMessageDispatcher {
  public:
    NetMessageDispatcher(MessageEventHandler^ handler) {
      m_Dispatcher = new MessageDispatcher( new SessionFactory(handler->GetNativeObject()) );
    }

  private:
    MessageDispatcher* m_Dispatcher;
}

このアプローチは正しいですか、それとも他のベスト プラクティスがありますか?

4

1 に答える 1

0

基本的な原則はOKです。ネイティブオブジェクトが必要な場合は、それを公開する必要があります。それは簡単です。結局のところ、C++\CLI はこのようなことを可能にするように設計されているため、元に戻すことに問題はありません。

最終的には、管理された NetMessageDispatcher から MessageDispatcher を作成する責任を移すことができます。コンストラクターで MessageDispatcher を直接渡す方がおそらく良いでしょう。

また、ここでメモリ リークが発生しないように注意してください。新しいものはたくさんありますが、削除はありません。たとえば、これを確認して、ネイティブ クラスで標準のスマート ポインターを使用します。

于 2013-10-02T10:32:11.710 に答える