c++类设计建议
C++ Class Design Advice
我有一个Node类模板,它以Data类型作为模板参数:
template <class T_Data>
class Node
{
};
Node类能够在某些事件上通知用户/侦听器。此功能是使用libsigc++
信号实现的,但在发出信号之前,Node通知处理程序对象,该处理程序对象进行一些处理并决定是否发出信号。这个处理程序对象的存在是因为在某些情况下,我希望节点对象处理它们自己的事件,阻塞信号。
常见的解决方案是为Node提供任何人都可以在派生类中重写的虚拟方法,但由于Node使用对自身的引用并创建自己类型的对象,因此使用HandlerBase类并让人们派生处理程序更容易。
一切都很好,直到我写了一个处理程序类,我想我的节点使用它。但是为了启用新的处理程序,我需要调用一个静态Node方法Node::set_event_handler()
。意思是我得记得在什么地方打电话。如果有人想使用我的处理程序,他们必须记住在main()或一些主类的一个actor中设置处理程序,可能是他们在GUI应用程序中的Window类。
template <class T_Data>
class Node
{
public:
static void set_event_handler (std::unique_ptr <HandlerBase> new_handler);
private:
static std::unique_ptr <HandlerBase> event_handler;
};
所以我想出了两个可能的解决方案:
- 把呼叫
set_handler()
在一些主类我有 - 添加T_Handler模板参数到Node类
当前,静态处理程序字段被设置为一个新的HanderBase,它忽略所有信号。如果我使用模板参数,则可以使用不同的处理程序具有相同的Data类型,并且静态字段将在初始化时设置,因此不需要额外的工作。
问题是,T_Handler是否只是给Node增加了"混乱",使它在为处理程序类型添加模板参数的意义上不那么"干净",许多Node用户甚至不需要。
实际上,我也可以给T_Handler一个默认值,这样用户就可以忘记它,因为他们不需要它,但我仍然好奇哪种设计可能更好。
当然它增加了杂乱,使它不那么干净。然而,这真的是一个大问题吗?我想这取决于你的看法。
如果您查看标准库中的许多模板,您将看到大多数用户不需要的模板参数。默认值和typedef
用于隐藏这种混乱。例如,参见std::basic_string,其中:
- 大多数用户不关心
traits
或Alloc
,所以这些参数有默认值
charT
的一个流行值是简单的char
,所以std::string类型被定义为简写。注意,这些杂乱只是隐藏的。如果你需要调试你的代码,并且你在调试器中查看变量的类型,它就会咬你一口。div;)
- 没有找到相关文章