c++中只有静态方法的类的优点
Advantages of classes with only static methods in C++
尽管c++中没有静态类,但是从Java背景中,我使用Util
创建了一个只包含静态方法的助手类。这是糟糕的风格还是通常的做法?我看到的另一种选择是使用C函数(根本没有类上下文)。还有其他的选择吗?它们的优点和缺点是什么,在什么情况下我会使用它们。
在c++中定义一堆静态方法建议将命名空间静态函数作为一种选择,尽管我没有看到没有类上下文的static
关键字有什么影响。
如果您想创建一个实用函数集合而不破坏全局命名空间,您应该只在它们自己的命名空间中创建常规函数:
namespace utility {
int helper1();
void helper2();
};
你可能也不想让它们成为静态函数。在非成员函数的上下文中(与成员函数相反),C和c++中的static关键字只是将函数的作用域限制为当前源文件(也就是说,它使函数对当前文件私有)。它通常只用于实现用C编写的库代码使用的内部辅助函数,这样得到的辅助函数就不会有暴露给其他程序的符号。这对于防止名称之间的冲突很重要,因为C没有名称空间。
在c++中,只有 static
方法的类多用于模板元编程。
#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;
}
在线演示:http://www.ideone.com/oH79u
c++是一种多范式语言,所以如果你需要一些可能根本不适合类的util函数,那么我就把它们变成自由函数。我看不出有什么理由把它们放到类中,仅仅是为了面向对象。
没有优势,我可以看到使所有的函数static
和把它们放在一个类,有他们只是作为自由的函数。就个人而言,我认为自由函数是一个更容易使用的选项。
正如许多人指出的那样,在命名空间内使用自由函数是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;
}
如果你不使用模板,就坚持使用名称空间。
在类中声明静态方法没有真正的问题。虽然名称空间更适合这个目的,因为你提到的帖子中提到的原因。
使用C函数可能会产生名称冲突,除非你决定了一个命名约定,用一些东西作为函数的前缀,例如btFunctionA, btFunctionB等。为了避免这种情况,您需要将符号保留在命名空间中,毕竟您使用的是c++而不是C。
名称空间中的静态函数与非静态函数没有任何区别。我相信static关键字在这种情况下是可以忽略的。
在c++中,让它们成为自由函数。根本没有必要或理由把他们放在一个班级里。除非你的模板很烂
这可能与您的兴趣相关。这篇文章考察了Java与其他语言相比实现类和函数的不同方法。
http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html还有另一种情况,静态类可能比名称空间更受欢迎:当您希望将数据设为私有,这样就不能从类/名称空间外部直接修改数据,但出于性能原因,您希望使用公共内联函数对其进行操作时。我不认为在命名空间中有任何方法可以做到这一点,除了在命名空间中声明一个类。
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CMake 的静态方法链接错误
- 在子类上调用模板化静态方法时获取类的类型名
- 仅具有公共静态方法的帮助程序类
- 调用没有主体的未实现静态方法
- 如何从C 的朋友类访问私有静态方法