c++类设计建议

C++ Class Design Advice

本文关键字:c++      更新时间:2023-10-16

我有一个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;
};

所以我想出了两个可能的解决方案:

  1. 把呼叫set_handler()在一些主类我有
  2. 添加T_Handler模板参数到Node类

当前,静态处理程序字段被设置为一个新的HanderBase,它忽略所有信号。如果我使用模板参数,则可以使用不同的处理程序具有相同的Data类型,并且静态字段将在初始化时设置,因此不需要额外的工作。

问题是,T_Handler是否只是给Node增加了"混乱",使它在为处理程序类型添加模板参数的意义上不那么"干净",许多Node用户甚至不需要。

实际上,我也可以给T_Handler一个默认值,这样用户就可以忘记它,因为他们不需要它,但我仍然好奇哪种设计可能更好。

当然它增加了杂乱,使它不那么干净。然而,这真的是一个大问题吗?我想这取决于你的看法。

如果您查看标准库中的许多模板,您将看到大多数用户不需要的模板参数。默认值和typedef用于隐藏这种混乱。例如,参见std::basic_string,其中:

  • 大多数用户不关心traitsAlloc,所以这些参数有默认值
  • charT的一个流行值是简单的char,所以std::string类型被定义为简写。

注意,这些杂乱只是隐藏的。如果你需要调试你的代码,并且你在调试器中查看变量的类型,它就会咬你一口。div;)

相关文章:
  • 没有找到相关文章