Я пытаюсь создать класс, который включает равномерное распределенное случайное число. Я использую Visual Studio 2010 c++.
http://msdn.microsoft.com/en-us/library/vstudio/ee462299%28v=vs.100%29.aspx http://msdn.microsoft.com/en-us/library/ee462299.aspx
Пробовал много комбинаций из этих двух ссылок, но я не могу найти решение для своих нужд. Мой текущий код:
A) MyProblem.h
#include <random>
class MyProblem
{
public:
int calculateMyProblem();
private:
double _uniformRandNum;
std::mt19937 _generator(1729); // for 1729 I get ERROR: Expected a type specifier
std::uniform_real_distribution<> _distribution(0,1); // for both 0 an 1 i get ERROR: Expected a type specifier
void generateUniformDistrNum();
void calculateMeanDistance();
};
Для двух строк я получаю ошибки
error C2059: syntax error : 'constant'
error C2059: syntax error : 'constant'
B) MyProblem.cpp
MyProblem::MyProblem()
{}
int MyProblem::calculateMyProblem()
{
generateUniformDistrNum();
// other stuff to be done with random number _uniformRandNum
}
void MyProblem::generateUniformDistrNum()
{
_uniformRandNum = (double) _distribution(_generator); // ERROR, see below
}
Сгенерированные ошибки:
error C3867: 'MyProblem::_generator': function call missing argument list; use '&MyProblem::_generator' to create a pointer to member
error C2660: 'MyProblem::_distribution' : function does not take 1 arguments
Я пытаюсь целый день, я не мог понять. Как я могу это исправить?
Вы не можете инициализировать члены (которые не являются static или const) в классе body using(). Вам нужно сделать это в списке инициализации конструктора или в его теле (или вне определения класса в одном исходном файле как для статических членов:
файл заголовка:
class MyProblem
{
public:
int calculateMyProblem();
private:
double _uniformRandNum;
std::mt19937 _generator;
std::uniform_real_distribution<> _distribution;
void generateUniformDistrNum();
void calculateMeanDistance();
};
исходный файл:
MyProblem::MyProblem() : _generator( 1729), _distribution( 0, 1) {}
//... the rest of function defs
Однако в С++ 11 вы можете использовать {} для инициализации членов в классе:
class MyProblem {
//...
std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};
//...
}
Когда вы используете инициализаторы элементов нестатического ввода С++ 11 для инициализации членов данных в определении класса, вы должны использовать фигурные скобки (или равные) для инициализации. Ваш код будет правильным, если вы измените две линии нарушения на
std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};
Тем не менее, это все равно не будет работать на VS2010 (я думаю, вам нужно VS2013 для его работы). Поэтому ваш единственный вариант с этим компилятором - выполнить инициализацию в списке инициализаторов конструктора.
MyProblem::MyProblem()
: _generator(1729)
, _distribution(0,1)
{}