C++中没有数据成员的类

11

这可能不是关于 C++ 的特定问题,而更多涉及面向对象编程。我对此很新,并且我对我的设计持怀疑态度。我有一个类 Parser,基本上实现了许多处理解析表达式、从中缀转换为后缀等功能的函数。我在主函数中使用这些 Parser 函数。我意识到我不需要这个类的任何数据成员。因此,我实际上不需要这个类的对象。因此,我最终将类中的每个函数都设置为静态函数。这种设计是否有些奇怪?我应该将其作为接口吗?有什么建议吗?


8
通常在C++中,非成员函数会放置在命名空间(namespace)中。不需要使用类来组织这样的函数。 - juanchopanza
1
如果你只有一个解析器,那么命名空间就可以了。如果你有Parser1和Parser2,并且想要能够使用其中任何一个,这种设计是一个明智的方式来实现它。 - Marc Glisse
在这种情况下,为什么不使用两个不同的命名空间呢? - user592748
1
与https://dev59.com/2Gs05IYBdhLWcg3wQvuq相关的内容。 - amdn
1
@user592748 你不能将命名空间作为模板参数传递。 - Marc Glisse
4个回答

7
  1. 你需要一个解析器,你知道你想让它为你做什么 - 这实际上就是你的"接口"。

  2. 你当前的解析器实现不需要任何成员变量 - 因此,为了实现你的接口,你不需要一个类。因此,请摒弃你的静态方法。像Kevin所说的那样,使用一个命名空间和普通函数(非静态)是一个很好的主意。

  3. 如果你觉得你将需要添加一个新的解析器,该解析器将需要维护内部状态,那么你可能希望在(1)中定义一个接口 - 一个普通的公开可见的头文件,其中包含你选择的命名空间中的函数声明就足够了。


谢谢,这解决了我的疑惑。感谢您澄清了接口的含义并解释了如何处理第二种情况。 - user592748
静态方法不能自动从父对象的构造函数中调用。 - peterh

6
一个只包含静态函数的类在我看来与命名空间没有太大区别。那么,为什么不直接使用命名空间呢?

不确定这有多重要,但是在我所知道的模拟框架中,你无法模拟命名空间。 - user334856
1
不,一个没有数据成员的类 可以 有构造函数。 - peterh
1
构造函数并不是很有趣,因为它与另一个静态函数没有什么区别。析构函数可能会有趣,但是一个有趣的析构函数可能需要至少一个布尔数据成员来记录类是否已被移动(因此析构函数不应该执行它原本要执行的任何有趣操作)。 - Lily Ballard
1
不行,因为静态函数不能声明为父类的成员,而没有数据的成员类可以。因此,一个封闭类中没有成员的类的构造函数将自动调用。这个特性无法通过静态函数实现。 - peterh

1
决定这个问题的方法在于如何使用这些函数?
1) 如果所有的函数都在一个文件中使用且不需要导出到任何其他地方,则绝对使用静态函数。为什么?因为你可以直接将它们输入到.cpp文件中类体的代码中,而不必担心维护声明并保持参数对齐。因为当一个C++类被解析时,在类体内定义的每个函数内部的代码都会被跳过,然后在声明所有类成员之后解析,所以所有的函数都可以互相看到,并处于更好的名称情况。如果你在类中直接声明较小的函数,编译器也会内联很多。
2) 如果这些函数需要从当前的.cpp文件之外使用,则使用普通函数。因为以后它们可以从任何其他地方使用,并且通过名称导出它们更容易。

0
通常将实用程序函数设为静态的是很常见的做法。因此,如果您的解析器类的函数彼此并不依赖,那么完全可以将它们设为静态的。但如果它们互相依赖,而且可能有其他方式可以完成同样的功能,那么您应该考虑使用接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接