仅包含公共函数的C++类

4
我希望有一个仅包含公共函数的类,例如:
class foo
{
    public:
        int f1(param1, param2) ;
        void f2(param1, param2);
};

这个类没有状态,只是操作输入参数, 像辅助类一样行事,

这是一个好的设计吗?还是需要特殊的模式? 这种模式叫什么名字?


2
你所需要做的就是将“class”改为“struct”,甚至不需要加上“public:” ;) - FoggyDay
2
如果没有状态,你可以使用自由函数。 - mkaes
如果您需要逻辑上联合一些函数,类/结构体是一个很好的解决方案。 - Arkady
应该阅读这篇文章 https://dev59.com/zXM_5IYBdhLWcg3wThN3 - Яois
2
也许你应该解释一下为什么需要一个类(实际上你可能有很好的理由)。如果你无法解释,那么你就不需要一个类。 - juanchopanza
显示剩余8条评论
3个回答

8

简短回答:在命名空间中使用函数。

namespace foo
{
    int f1(param1, param2);
    void f2(param1, param2);
}

然而,如果您的应用程序具有面向对象的设计,您应该问自己为什么需要一堆只是操作输入参数的函数。相信我:您的代码试图告诉您某些事情 :-)

在您的代码片段中,您使用了虚拟名称(foo、f1、f2、param1、param2),因此我无法猜测您的函数是做什么的。但也许您的函数操作相同的参数:在这种情况下,您可以将该参数提升为类。

之前:

bool IsLeapYear( int date );
void IncrementDay( int date, int numOfDays );

之后:

class Date
{
    public:
        bool IsLeapYear() const;
        void IncremetDay( int numOfDays );
    private:
        int daysFromOrigin;
};

如果您的函数需要不同的参数,那么您可以考虑将这些函数分配到现有的类中(前提是您确实需要面向对象的设计)。
最后,如果您的函数没有关联性,您可以考虑将它们移动到现有的类中,甚至作为静态方法(这取决于函数的含义)。
至于您的最后一个问题“这是一个好的设计吗?”,嗯,这取决于您正在开发的设计:
- 面向对象设计:可能不是一个好的面向对象设计,但是如果没有更多的上下文,很难说。 - 过程式设计:可以接受。 - 函数式设计:可以接受。
虽然这可能或可能不是根据您的范例一个好的设计,但肯定不是一个好的 C++ 习惯:您应该在命名空间内使用自由函数而不是仅具有静态方法的类。

@doctorlove 我将“if your application has a OO design”这句话加粗了。如果你的应用程序是功能性的,那么它就没有面向对象的设计。在这种情况下,你可以选择我的简短回答 :-) - Daniele Pallastrelli
我可以为您提供一个关于面向对象设计的真实生活好例子,即只有公共函数的类是一个好的设计。假设您创建了一个名为“ switcher”的类,该类将接口类作为成员,该接口类必须具有void on()和void off()函数。名为LED的接口类可能是无状态的,但名为toaster的接口类可能不是... - Spyros Mourelatos
另外,由于注释不能太长,这是我的示例 https://godbolt.org/z/1cq5Ea - Spyros Mourelatos

7

只需将它们变成自由函数。C++ 中并非所有东西都必须在类中。例如,如果你查看 STL,你会发现它有许多自由函数。


2
自由函数放在命名空间里怎么样? :) - Яois
1
@KeillRandor - 它们仍然是独立的。 - Sean

1
确保在不使用类的实例的情况下调用方法时,将其声明为静态方法。
然后,您可以使用以下语法调用它们:
foo::f1(param1, param2)

将它们放在类而不是结构体中或使它们独立使用可以使您的程序更加面向对象,易于建模(使用UML或类似工具)并创建与系统其他部分之间的关系(通过继承、多态等方式)。

如果您的程序的其余部分也是面向对象的,则使其与程序的其余部分一致。

所以我会说,是一个好的设计。


我认为在C++中,在命名空间中使用自由函数更加常见。 - doctorlove
1
我看过许多类似的项目,但是在更现代的项目中,情况往往不是这样。我想这在很大程度上取决于项目本身,也许最好的建议是在做出改变之前先查看代码库中还有什么其他东西。如果 OP 从零开始,我会始终推荐采用100% 面向对象的方法。 - Sam Fare
2
使用仅由静态成员函数组成的类代替命名空间是不好的设计。这与“面向对象”没有任何关系,而且C++甚至不是一种面向对象的语言。 - Simple
2
你能解释一下为什么你认为这是糟糕的设计吗?C++可能不像Ruby或Java那样,但它仍然支持对象。即使不支持本地OO语法的语言也可以并且正在按照OO原则使用,因此在2014年没有理由不使用它。 - Sam Fare
拥有自由函数会使你远离面向对象编程是一个完全错误的观点。面向对象编程并不意味着“所有东西都是成员函数”。 - Lightness Races in Orbit

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