以静态方式使用Random类
Using a Random class in a static way
我正在制作一个简单的Random
类:
class Random
{
public:
static bool seeded = false;
static void SeedRandom( int number )
{
srand(number);
}
static int GetRandom(int low, int high)
{
if ( !seeded )
{
srand ((int)time(NULL));
}
return (rand() % (high - low)) + low;
}
};
显然,C++不允许将整个类声明为static
(这就是为什么在C#中这么容易做到的原因(。相反,我把所有成员都设为static
。也没有static
构造函数,所以我没有办法初始化我的bool seeded
,除非我手动调用一个函数,这会破坏目的。相反,我可以使用一个常规构造函数,在这个构造函数中我必须创建一个Random
的实例,这是我不想做的
另外,有人知道新的C++0x标准是否允许静态类和/或静态构造函数吗?
c++不允许将整个类声明为静态
当然有。
class RandomClass
{
public:
RandomClass()
{
srand(time(0));
}
int NextInt(int high, int low)
{
return (rand() % (high - low)) + low;
}
}
RandomClass Random; //Global variable "Random" has static storage duration
//C# needs to explicitly allow this somehow because C# does not have global variables,
//which is why it allows applying the static keyword to a class. But this is not C#,
//and we have globals here. ;)
实际上,没有理由把这个放在课堂上。C++不会强迫你把所有的东西都放到类中——这是有充分理由的。在C#中,您被迫将所有内容放入一个类中,并在静态方法等中声明内容,但不是表意的C++。
你真的不能只使用表意的C#代码,然后用C++编写,并期望它能很好地工作。它们是非常不同的语言,具有非常不同的要求和编程特性。
如果你想用一种表意的C++方法来实现这一点,那就不要创建一个类。在main
中调用srand
,并定义一个执行箝位的函数:
int RandomInteger(int high, int low)
{
return (std::rand() % (high - low)) + low;
}
EDIT:当然,最好使用新的随机数生成功能和uniform_int_distribution
来获得钳制范围,而不是rand
。参见被认为有害的rand()
。
无论如何都需要在cpp文件中定义static bool seeded
,并且必须在那里对其进行初始化。
bool Random::seeded = false;
您不必在C++中使所有东西都成为一个类。
namespace Random
{
bool seeded = false;
void SeedRandom(int number)
{ srand(number); }
int GetRandom(int low, int high)
{
if (!seeded)
{ srand((int)time(NULL)); }
return (rand() % (high - low)) + low;
}
}
试试这个:
class Random
{
public:
static bool seeded;
static void SeedRandom(int number)
{
srand(number);
seeded = true;
}
static int GetRandom(int low, int high)
{
if (!seeded)
SeedRandom(time(0));
return (rand() % (high - low)) + low;
}
};
bool Random::seeded;
默认情况下,static
bool
s被初始化为false
,因此不需要显式地这样做。请注意,您实际的类逻辑也是错误的,因为您从未将seeded
设置为true
。
您可以始终使用singleton模式来处理此问题,方法是为对象提供私有构造函数和静态访问器。
class Random
{
public:
static Random& instance()
{
static Random instance;
return instance;
}
// your other functions here
private:
Random()
{
// your seed code here
}
};
这将确保您只有一个类的实例,并且每当您需要随机时,您只需要调用random::instance((.function((
拥有一个带有静态方法的类的原因是什么?也许有一个替代者可以实现你的目标。你在找类似单身汉的东西吗?
顺便说一句,如果您的类声明中有静态成员变量,正如前面的其他答案所指出的,那么在使用它们之前,您必须在类外初始化它们(最好在cpp文件中(。因此,如果您按照以下步骤初始化:
bool Random::seeded = false
它将根据您的需要自动初始化为false。
- 如何在c++中为模板函数实例创建快捷方式
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 在c代码之间共享数据的最佳方式
- 如何以编程方式使窗口全屏显示?
- 以编程方式防止重命名或删除文件,但仍使其可写
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 为什么这些toupper在这样使用时工作方式不同
- 使 c++ 程序以交互方式将输入输出传递给 windows 命令 prommpt
- 告诉 PDCurses 以编程方式使窗口与物理屏幕大小相同的方法
- 如何使用 calloc/malloc 等函数对动态创建的存储进行正确排序,使其以 FIFO 方式运行
- 如何使系统进入睡眠状态并再次自动(以编程方式)从睡眠状态恢复,而无需任何手动"鼠标单击或键盘点击"
- 使类信息在运行时可访问的可扩展方式
- 如何使C++类以 const 方式访问另一个类的所有私有成员(仅读取而不写入)
- 我如何使连续内存以一种安全的方式表现多态
- 以这样的方式填充数组,使每个元素等于两个数字的最小和
- 如何以编程方式使系统崩溃
- 以静态方式使用Random类
- 干净的方式,使可移植的端正确的文件读取/编写代码在c++