从CLI包装器中检索本机对象

时间:2013-10-02 09:46:46

标签: c++ c++-cli

我有一些相互作用的原生物体 现在,我将其中一些对象包装到托管类中。但在某些情况下我必须检索本机包装对象。

例如,请使用以下对象:

这是一个创建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;
}

这种方法是否正确还是有其他一些最佳做法?

1 个答案:

答案 0 :(得分:0)

基本原则是好的:如果你需要本机对象,你必须公开它,就这么简单。在完成所有C ++ \ CLI设计以使这样的事情成为可能之后,回归它没有问题。

最终,您可以从托管的NetMessageDispatcher中移除创建MessageDispatcher的责任:NetMessageDispatcher知道需要知道如何从MessageEventHandler创建MessageDispatcher,这样就不需要额外的依赖。最好直接在构造函数中传递MessageDispatcher。

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