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

基本原则是好的:如果你需要原生对象,你必须公开它,就这么简单。像你一样返回它是没有问题的,毕竟 C++\CLI 旨在使这样的事情成为可能。

最终,您可以将创建 MessageDispatcher 的责任从托管的 NetMessageDispatcher 中移出:NetMessageDispatcher 知道需要知道如何从 MessageEventHandler 创建 MessageDispatcher,因此这是不必要的额外依赖项。直接在构造函数中将 MessageDispatcher 传递给它可能会更好。

还要注意不要在这里引入内存泄漏,你有很多新的但没有删除。例如检查这个并在您的本机类中使用标准智能指针。

于 2013-10-02T10:32:11.710 回答