我应该声明我的对象是全局的还是静态的?
should I declare my object global or static?
我使用c++ 11中的<random>
绘制随机数。我通过创建以下类的实例obj
来做到这一点(对于感兴趣的读者:它来自这个线程):
class RNG
{
public:
typedef std::mt19937 Engine;
typedef std::uniform_real_distribution<double> Distribution;
double operator()()
{
return distribution(engine);
}
Engine engine;
Distribution distribution;
};
呼叫obj()
会得到我想要的随机数。现在,我有三个函数都必须使用obj
。声明obj
全局将工作,但它也是正确的吗?或者还有其他(更正确的)选择吗?
看情况。如果您的程序中使用RNG
的部分由并且很可能由这三个函数组成(尽管很难看到未来),并且这些函数只需要在一个对象上工作-总是相同的,所有时间-那么为什么不将该对象设置为全局对象呢?
避免限制类型只有一个实例(单例模式),除非这是该类型的固有特征。如果你的程序只使用RNG
的一个实例,那么你的程序将只创建一个实例(即,使对象全局,或者约束你的程序-而不是类型-只创建一个实例)。我可以很好地想象其他库或程序可能会创建几个随机生成器。
RNG
实例上工作(尽管一次一个),那么您需要让它们将该类的一个实例作为函数参数,并让它们处理该参数。客户端必须注意提供适当的RNG
实例作为这些函数的参数。
然后,如果有一天你意识到这些函数最终也会在其他对象类型上工作,并且这些数据以某种方式相互关联,你可以考虑将它们包装在一个数据结构或一个类中,可能使你的函数成员函数该类-如果它执行的操作是该类型的基本。
在不知道你想要什么,不知道你要写什么样的应用程序或库的情况下给出一般的指导方针是不容易的。使用单例模式
只需添加一个方法:
static RNG& inst()
{
static RNG instance;
return instance;
}
并禁止复制你的对象:
private:
RNG(const RNG&); // without implementation
RNG& operator=(const RNG&); // without implementation
然后你可以访问你的实例:
d = RNG::inst()();
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++函数中声明静态 2D 数组?
- 静态变量声明和定义
- 使用静态成员声明类时遇到问题
- 调用在 HXX 文件中声明的静态数据成员
- 将在堆栈上声明的元素添加到静态数组
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类的静态结构指针声明在C++
- 关于静态常量数据模因的声明和定义的混淆
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 静态声明专用类的接口指针数组
- C 中静态声明的结构的范围是什么?
- EXC_BAD_ACCESS 在 std::vector <double>的静态声明意外破坏时
- 私有静态声明和后续初始化
- 静态声明的二维数组C++为类的数据成员
- C++静态声明
- c++类中的静态声明
- c++内部静态声明和动态声明的区别是什么?
- 模板函数中特定于类型的静态声明
- Qt中对静态声明变量的未定义引用