即使C++中没有静态类,来自Java背景我也会创建一个类似于Util只包含静态方法的辅助类.这被认为是不好的风格还是通常的做法?我看到的一个替代方案是使用C函数(根本没有类上下文).有什么其他选择吗?有什么优点和缺点,在哪种情况下我会使用其中任何一种.
在c ++中定义一堆静态方法建议使用命名空间静态函数作为一种替代方法,尽管我没有看到static没有类上下文的关键字有什么影响.
Jam*_*rty 34
如果要在不破坏全局命名空间的情况下创建实用程序函数集合,则应该只在自己的命名空间中创建常规函数:
namespace utility {
int helper1();
void helper2();
};
Run Code Online (Sandbox Code Playgroud)
你可能也不想让它们成为静态函数.在非成员函数的上下文中(与成员函数相反),C和C++中的static关键字只是将函数的范围限制为当前源文件(也就是说,它使函数对于私有函数而言是私有的.当前文件).它通常仅用于实现由C编写的库代码使用的内部辅助函数,因此生成的辅助函数没有暴露给其他程序的符号.这对于防止名称之间的冲突很重要,因为C没有名称空间.
Naw*_*waz 15
在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;
}
Run Code Online (Sandbox Code Playgroud)
在线演示:http://www.ideone.com/oH79u
C++是一种多范式语言,所以如果你需要一些可能根本不适合类的util函数,那么我只需要它们自由函数.我没有理由将它们放入课堂,只是为了OOP的缘故.
我可以看到制作所有函数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
}
};
Run Code Online (Sandbox Code Playgroud)
您可以使用它来实现模板命名空间的效果:
int main ()
{
double data;
utils<double>::item_type item ;
utils<double>::foo(data, item);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用模板,请坚持使用名称空间。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
26863 次 |
| 最近记录: |