以静态方式使用Random类

Using a Random class in a static way

本文关键字:Random 方式使 静态      更新时间:2023-10-16

我正在制作一个简单的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;

默认情况下,staticbools被初始化为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。