即使有来自Java背景的no static classes in C++,我也会创建一个像Util
这样只包含静态方法的辅助类。这被认为是糟糕的风格还是通常的做法?我看到的一个替代方案是使用C函数(根本没有类上下文)。有什么其他选择吗?有什么优点和缺点,在哪种情况下我会使用其中任何一种。
defining bunch of static methods in c++建议使用命名空间静态函数作为一种替代方法,但我没有看到没有类上下文的static
关键字有什么影响。
答案 0 :(得分:31)
如果要在不破坏全局命名空间的情况下创建实用程序函数集合,则应该只在自己的命名空间中创建常规函数:
namespace utility {
int helper1();
void helper2();
};
您可能也不想让它们成为静态函数。 在非成员函数的上下文中(与成员函数相反),C和C ++中的static关键字只是将函数的范围限制为当前源文件(也就是说,它使函数对于私有函数而言是私有的。当前文件)。它通常仅用于实现由C编写的库代码使用的内部辅助函数,因此生成的辅助函数没有暴露给其他程序的符号。这对于防止名称之间的冲突非常重要,因为C没有名称空间。
答案 1 :(得分:13)
在C ++中,仅使用 static
方法的类主要用于模板元编程。
例如,我想在编译时本身计算斐波纳契数,并且在运行时我希望它们只打印,然后我可以编写这个程序:< / p>
#include <iostream>
template<int N>
struct Fibonacci
{
static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value;
static void print()
{
Fibonacci<N-1>::print();
std::cout << value << std::endl;
}
};
template<>
struct Fibonacci<0>
{
static const int value = 0;
static void print()
{
std::cout << value << std::endl;
}
};
template<>
struct Fibonacci<1>
{
static const int value = 1;
static void print()
{
Fibonacci<0>::print();
std::cout << value << std::endl;
}
};
int main() {
Fibonacci<20>::print(); //print first 20 finonacci numbers
return 0;
}
答案 2 :(得分:6)
C ++是一种多范式语言,所以如果你需要一些可能根本不适合某个类的util函数,那么我只能让它们成为自由函数。我没有理由将它们放入课堂,只是为了OOP的缘故。
我可以看到制作所有函数static
并将它们放在一个类中,而不是将它们作为自由函数。就个人而言,我认为免费功能更容易使用。
答案 3 :(得分:2)
正如许多其他人所指出的那样,名称空间中的自由函数是c++
中常见的一种方法。
我要为具有所有静态函数的类创建的一种情况是,当您希望将一组函数公开给从模板参数派生的信息时,即
template <typename Ty>
class utils
{
public :
// if you need to setup a bunch of secondary types, based on "Ty" that will be used
// by your utility functions
struct item_type
{
Ty data;
// etc
};
// a set of utilities
static void foo(Ty &data1, item_type &item)
{
// etc
}
};
您可以使用它来实现模板命名空间的效果:
int main ()
{
double data;
utils<double>::item_type item ;
utils<double>::foo(data, item);
return 0;
}
如果您不使用模板,请坚持使用名称空间。
希望这有帮助。
答案 4 :(得分:1)
这可能与您的兴趣相关。这是一篇文章,与其他语言相比,它检查了Java中类和函数的不同方法。
http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
答案 5 :(得分:1)
在类中声明静态方法没有真正的问题。尽管由于您所指的帖子中提到的原因,名称空间更适合此目的。
使用C函数可以生成名称冲突,除非您决定命名约定,为函数添加前缀,例如btFunctionA,btFunctionB等。 您需要将符号保留在命名空间中以避免这种情况,您使用的是C ++而不是C语言。
命名空间中的静态函数与非静态函数没有任何不同。我相信在这种情况下只会忽略static关键字。
答案 6 :(得分:1)
在C ++中,只需使它们成为自由函数即可。根本没有必要或没有理由将它们放在课堂上。除非你正在使用模板进行调整。
答案 7 :(得分:0)
在另一种情况下,静态类可能比命名空间更可取:当您想要将数据设为私有数据,以便不能从类/命名空间外部直接修改数据时,出于性能原因,您想要具有公开的内联功能。除了在名称空间中声明一个类外,我认为没有任何其他方法可以使用名称空间。