2015-11-19 3 views
0

Есть несколько хороших ответов like this, которые предлагают сжатое случайное приложение, но у меня возникают проблемы с расширением от него до небольшой части большего приложения.Как использовать библиотеку C++ 11 в большом приложении?

Вот что я делаю:

#include <random> 

class RandomFP16 
{ 
public: 
    static RandomFP16* GetInstance(); 
    int GetRandom(); 
private: 
    static RandomFP16* singleton; 
    RandomFP16(); 
    std::mt19937 mt; 
    std::uniform_int_distribution<int> dist; 
}; 

RandomFP16* RandomFP16::GetInstance() 
{ 
    if(singleton == 0) 
    { 
     singleton = new RandomFP16(); 
    } 
    return singleton; 
} 

RandomFP16::RandomFP16() 
{ 
    std::random_device rd; 
    //next two lines have errors 
    mt(rd()); 
    dist(0x00000000, 0x00010000); //fixed-point 16.16 
} 

int RandomFP16::GetRandom() 
{ 
    return dist(mt); 
} 

Так в основном, я хочу один общий генератор случайных чисел, который может быть использован в любом месте в любое время ... в случайном порядке. :-) Исходя из встроенных C и Windows, C#, я вижу какой-то странный синтаксис используется здесь, так что я не уверен, как структурировать, чтобы избавиться от этих ошибок:

error: no match for call to '(std::mt19937 {aka std::mersenne_twister_engine<unsigned int, 32u, 624u, 397u, 31u, 2567483615u, 11u, 4294967295u, 7u, 2636928640u, 15u, 4022730752u, 18u, 1812433253u>}) (std::random_device::result_type)' 
    mt(rd()); 
      ^

.

error: no match for call to '(std::uniform_int_distribution<int>) (int, int)' 
dist(0x00000000, 0x00010000); 
          ^

ответ

0

Хорошо, я понял. Проводка в любом случае, чтобы спасти кого-то работу.


#include <random> 

class RandomFP16 
{ 
public: 
    static RandomFP16* GetInstance(); 
    int GetRandom(); 
private: 
    static RandomFP16* singleton; 
    RandomFP16(std::random_device::result_type seed); 
    std::mt19937 mt; 
    std::uniform_int_distribution<int> dist; 
}; 

RandomFP16* RandomFP16::singleton = 0; 

RandomFP16* RandomFP16::GetInstance() 
{ 
    if(singleton == 0) 
    { 
     std::random_device rd; 
     singleton = new RandomFP16(rd()); 
    } 
    return singleton; 
} 

RandomFP16::RandomFP16(std::random_device::result_type seed) 
    : mt(seed), dist(0x00000000, 0x00010000) //fixed-point 16.16 
{ 
} 

int RandomFP16::GetRandom() 
{ 
    return dist(mt); 
} 

Оказывается, определение класса был прав; все проблемы были связаны с имплантацией:

  • Статическая переменная должна быть объявлена ​​снова за пределами определения класса. (не знаю почему)
  • Локальные переменные (не указатели) с конструкторами должны быть инициализированы следующим образом.
    • что добавили аргумент этого конструктора, который затем должен был быть подана из GetInstance()