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

在C+中没有数据成员的类+; 这可能不是C++的问题,更不用说面向对象编程了。我是新来的,我怀疑我的设计。我有一个类解析器,它基本上实现了许多处理解析表达式、从中缀到后缀的转换等的函数。我在主函数中使用这些解析器函数。我意识到这个类不需要任何数据成员。因此,我并不真正需要这个类的对象。因此,我最终使类中的每个函数都是静态的。这个设计有什么奇怪的地方吗。我应该把它作为一个接口吗?有什么建议吗?,c++,oop,class,interface,static,C++,Oop,Class,Interface,Static,在我看来,一个只有静态函数的类与一个名称空间是很难区分的。那么,为什么不使用名称空间呢?将实用程序函数设置为静态是很常见的,因此,如果解析器类的函数彼此不依赖,则完全可以将它们设置为静态。如果它们彼此依赖,并且可能可以以另一种方式完成相同的功能,则应该考虑使用接口。 你想要一个解析器,你知道你想要它为你做什么——实际上,这就是你的“接口” 解析器的当前实现不需要任何成员变量——因此,要实现接口,不需要类。所以,是的,去掉你的静态方法。正如Kevin所说,使用带有普通旧函数(非静态)的名称空间是一

在我看来,一个只有静态函数的类与一个名称空间是很难区分的。那么,为什么不使用名称空间呢?

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

  • 你想要一个解析器,你知道你想要它为你做什么——实际上,这就是你的“接口”

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

  • 如果您觉得需要添加一个新的解析器来维护内部状态,那么您可能需要在(1)中定义一个接口—一个普通的、旧的、公开可见的头文件,在您选择的名称空间中包含函数声明就足够了


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

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


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

    一般来说,在C++中,一个非成员函数会放在一个命名空间内。不需要一个类来对这样的函数进行分组。如果您只有一个解析器,一个名称空间就可以了。如果您有Parser1和Parser2,并且希望能够使用其中一个,那么这种设计是一种明智的方法。在这种情况下,为什么不使用两个不同的名称空间呢?与@user592748相关,您不能将名称空间作为模板参数传递。谢谢。这就把事情弄清楚了。感谢您澄清接口的含义并解释如何处理第二种情况。静态方法不能自动从父对象的构造函数调用。不确定这有多重要,但您不能模拟命名空间(在我所知道的模拟框架中)。不,一个没有数据成员的类可以有一个构造函数。一个构造函数并不有趣,因为它和另一个静态函数没有什么不同。析构函数可能很有趣,但有趣的析构函数可能至少需要一个布尔数据成员来记录类是否已被移动(因此析构函数是否不应该做任何有趣的事情)。不,因为静态函数不能声明为父类的成员,而数据较少的成员类可以。因此,将自动调用封闭类中无成员类的构造函数。这个特性可以通过静态函数实现。