以静态方式使用Random类

时间:2011-04-21 07:34:16

标签: c++ class random static

我正在制作一个简单的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标准是否允许静态类和/或静态构造函数?

6 个答案:

答案 0 :(得分:7)

  

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 ++

你真的不能只使用ideomatic C#代码,并用C ++编写代码,并希望它能很好地工作。它们是非常不同的语言,具有非常不同的要求和编程特征。

如果你想要一种思想的C ++方法,那就不要上课了。在srand内调用main,并定义一个能够完成约束的函数:

int RandomInteger(int high, int low)
{
    return (std::rand() % (high - low)) + low;
}

编辑:当然,最好使用新的随机数生成工具和uniform_int_distribution来获取钳制范围,而不是rand。请参阅rand() considered harmful

答案 1 :(得分:2)

无论如何,您的static bool seeded都需要在cpp文件中定义,并且必须在那里初始化。

bool Random::seeded = false;

答案 2 :(得分:1)

你不必在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; 
   }    

}

答案 3 :(得分:0)

试试这个:

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初始化为false,因此无需明确说明。请注意,您的实际类逻辑也是错误的,因为您从未将seeded设置为true

答案 4 :(得分:0)

您可以使用单例模式处理此问题,方法是将构造函数设为私有,并为对象提供静态访问器。


class Random
{
 public:
  static Random& instance()
  {
    static Random instance;

    return instance;
  }

  // your other functions here

 private:
  Random()
  {
    // your seed code here
  }    
};

这将确保您只有一个类的实例,并且只要您需要随机,您只需要调用Random :: instance()。function()

答案 5 :(得分:0)

你有一个静态方法的类是什么原因?可能有一个替代方案来实现您的目标。你在寻找与单身人士相似的东西吗?

顺便说一句,如果你的类声明中有静态成员变量,正如我之前的其他答案所指出的那样,你必须在使用它们之前在类之外初始化它们(最好是在cpp文件中)。因此,如果你按照这个并初始化你喜欢这个:

  bool Random::seeded = false 
它会自动初始化为假。