【问题标题】:Class with no data members in C++C++ 中没有数据成员的类
【发布时间】:2013-01-30 22:14:59
【问题描述】:

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

【问题讨论】:

  • 一般来说,在 C++ 中,人们会将非成员函数放在命名空间中。不需要一个类来对这样的函数进行分组。
  • 如果你只有一个解析器,命名空间就可以了。如果您有 Parser1 和 Parser2 并且希望能够使用其中任何一个,那么这种设计是一种明智的方式。
  • 在这种情况下为什么不使用两个不同的命名空间?
  • @user592748 你不能将命名空间作为模板参数传递。

标签: c++ oop class interface static


【解决方案1】:
  1. 您需要一个解析器,并且知道您希望它为您做什么 - 这实际上就是您的“接口”。

  2. 解析器的当前实现不需要任何成员变量 - 因此,要实现您的接口,您不需要类。所以是的,取消你的静态方法。正如 Kevin 所说,使用带有普通旧函数(非静态)的命名空间是个好主意。

  3. 1234563您选择的命名空间就足够了。

【讨论】:

  • 谢谢。这清除了它。为澄清接口的含义并解释如何处理第二种情况而点赞。
  • 不能从父对象的构造函数中自动调用静态方法。
【解决方案2】:

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

【讨论】:

  • 不确定这有多重要,但您不能模拟命名空间(在我知道的模拟框架中)。
  • 不,没有数据成员的类可以有构造函数。
  • 构造函数并不有趣,因为它与另一个静态函数没有什么不同。析构函数可能很有趣,但有趣的析构函数可能需要至少一个布尔数据成员来记录类是否已被移动(因此析构函数是否不应该做任何它想做的有趣的事情)。
  • 不,因为静态函数不能声明为父类的成员,而无数据成员类可以。因此,将自动调用封闭类中的无成员类的构造函数。此功能无法通过静态函数实现。
【解决方案3】:

决定这个问题的方法是如何使用这些函数?

1) 如果所有函数都在一个文件中使用,并且不需要导出到任何地方,那么一定要使用静态函数。为什么?因为您可以直接将它们键入到 .cpp 文件中的类主体中,而不必担心维护声明和保持参数对齐。因为在解析 C++ 类时,会跳过类主体中定义的每个函数内的所有代码,然后在声明所有类成员后进行解析,因此函数都可以相互看到并且处于更好的名称情况。编译器如果您像这样直接在类中声明它们,也会内联许多较小的函数。

2) 如果需要从当前 .cpp 文件外部使用函数,则使用普通函数。因为以后可以在其他任何地方使用它们,并且按名称导出它们更容易。

【讨论】:

    【解决方案4】:

    将实用程序函数设为静态是很常见的,因此,如果您的 Parser 类的函数不相互依赖,您完全可以将它们设为静态。如果它们相互依赖,并且可能以另一种方式完成相同的功能,则应考虑使用接口

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 2013-03-03
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2014-03-12
      • 1970-01-01
      相关资源
      最近更新 更多