Использование класса Random статическим способом - PullRequest
0 голосов
/ 21 апреля 2011

Я делаю простой 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 ]

7 голосов
/ 21 апреля 2011

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 ++ для этого, не создавайте класс вообще. Вызовите srand внутри вашего main и определите функцию, которая выполняет ваш зажим:

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

EDIT : Конечно, было бы лучше, если бы вы использовали новое средство генерации случайных чисел и uniform_int_distribution, чтобы получить свой фиксированный диапазон вместо rand. См. rand() считается вредным .

2 голосов
/ 21 апреля 2011

Ваш static bool seeded все равно должен быть определен в файле cpp, и вы должны инициализировать его там.

bool Random::seeded = false;
1 голос
/ 21 апреля 2011

Вам не нужно делать все классом в 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; 
   }    

}
0 голосов
/ 21 апреля 2011

Почему у вас есть класс со статическими методами? Может быть, есть альтернатива для достижения вашей цели. Вы ищете что-то похожее на синглтон?

Кстати, если у вас есть статические переменные-члены в объявлении класса, как указано в других ответах до меня, вы должны инициализировать их вне класса (предпочтительно в файле cpp), прежде чем использовать их. Поэтому, если вы выполните это и инициализируете свой код следующим образом:

 bool Random::seeded = false 
он будет автоматически инициализирован как ложный, как вы хотите.
0 голосов
/ 21 апреля 2011

Вы всегда можете подойти к этому с одноэлементным шаблоном, имея конструктор private и статический метод доступа к объекту.


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

    return instance;
  }

  // your other functions here

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

Это гарантирует, что у вас есть только один экземпляр класса, и всякий раз, когда вам нужен случайный случай, вам просто нужно вызвать Random :: instance (). Function ()

0 голосов
/ 21 апреля 2011

Попробуйте это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...