我有一些相互作用的原生物体 现在,我将其中一些对象包装到托管类中。但在某些情况下我必须检索本机包装对象。
例如,请使用以下对象:
这是一个创建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;
}
这种方法是否正确还是有其他一些最佳做法?
答案 0 :(得分:0)
基本原则是好的:如果你需要本机对象,你必须公开它,就这么简单。在完成所有C ++ \ CLI设计以使这样的事情成为可能之后,回归它没有问题。
最终,您可以从托管的NetMessageDispatcher中移除创建MessageDispatcher的责任:NetMessageDispatcher知道需要知道如何从MessageEventHandler创建MessageDispatcher,这样就不需要额外的依赖。最好直接在构造函数中传递MessageDispatcher。
另外注意不要在这里引入内存泄漏,你有很多新的但没有删除。例如,检查this并在本机类中使用标准智能指针。