我觉得这只是一个单纯的语法问题,但我无法找到一种独特/简洁的方式来描述它,因此谷歌没有帮助。
这是一个代码片段,可以看到我在说什么。在评论中指出了阻止编译的部分。
加入deck.h:
#include <random>
#include <iostream>
class Deck{
int top;
int cards[52];
public:
Deck();
void shuffle();
private:
// the "(0,51)" on the following line is a syntax error
// without it, compilation is fine
std::uniform_int_distribution<int> distribution(0,51);
std::shuffle_order_engine<std::default_random_engine, 52> engine;
};
Deck.cpp:
#include "Deck.h"
#include <random>
#include <algorithm>
Deck::Deck(){}
void Deck::shuffle(){
top = 0;
int oldCards[52];
std::copy_n(cards, 52, oldCards);
for(int i = 0; i < 52; i++){
int random = distribution(engine);
std::cout << "random= " << random << std::endl;
cards[i] = oldCards[random];
}
}
我需要将uniform_int_distribution
实例化,范围为0到51,以便对牌组进行洗牌。我可以将它声明为指针并动态分配它,但这似乎不应该是必要的。
根据C语言的经验,我正在努力学习编写好的,惯用的C ++代码,所以你能指出的任何其他内容都值得赞赏。当然,一旦我可以进行编译,将调试实际的混洗工作。
感谢您的回答。
答案 0 :(得分:2)
您可以使用花括号或复制初始化语法。
或者,您可以在每个构造函数的成员初始化列表中初始化该成员。
对于C ++ 03,后者是唯一的可能性。
大括号:
std::uniform_int_distribution<int> distribution{ 0, 51 };
复制初始化语法(仅在类型可复制或可移动时可用):
std::uniform_int_distribution<int> distribution =
std::uniform_int_distribution<int>( 0, 51 );
构造函数成员初始化列表中的初始化:
Deck::Deck()
: distribution( 0, 51 )
{}
答案 1 :(得分:0)
在类声明中初始化成员时,C ++ 11支持括号和大括号,例如:
class Deck
{
...
private:
std::uniform_int_distribution<int> distribution(0,51);
...
};
class Deck
{
...
private:
std::uniform_int_distribution<int> distribution{0,51};
...
};
对于非C ++ 11编译器,您必须使用包含类的构造函数的初始化列表来为类成员构造函数(C ++ 11编译器静默提供)将上面的代码翻译成幕后的这个逻辑,例如:
class Deck
{
...
private:
std::uniform_int_distribution<int> distribution; // <-- DO NOT try to invoke the constructor here!
...
};
Deck::Deck()
: distribution(0,51) <-- invoke the constructor here instead!
{
}