2011-12-30 100 views
0

我想实现一个简单的类似Quake的控制台。这个实现大致基于Doom 3中的实现:什么是地震式控制台中自动命令unregistring的正确方法?

class Console 
{ 
public: 
    ... 

    typedef boost::function<void(const Arguments&)> Callback; 

    void register_command(const std::string& name, const Callback& callback); 
    void unregister_command(const std::string& name); 
}; 

但是,我打算支持也可以卸载的可加载模块。当模块被卸载时,它需要注销它的命令。将它们一个一个地取消注册是很乏味和容易出错的。如何自动化它?

回答

1

你的Console::register_command函数返回一个对象。该对象(或其副本)具有一个成员函数:unregister。调用它将取消注册它提供的特定注册。

因此,每个模块可以有一个std::vector<>这些对象。它可以将其全部注销为其析构函数的一部分。

您不希望对象的析构函数执行此操作,除非您通过引用计数使对象像shared_ptr一样。或者如果您使用C++ 11并且可以使对象仅移动。

请注意,该对象需要引用它创建的对象Console。所以你可能会遇到终生问题,其中Console已被销毁,但并非所有这些创建的对象都消失了。处理这可能涉及使用shared_from_this,其中Console始终存储在shared_ptr(无论是boost::shared_ptr还是C++ 11 std::shared_ptr)。注册对象的weak_ptrConsole,所以他们可以测试,看看它是否还活着。

相关问题