我觉得这只是一个句法问题,但我找不到一种独特/简洁的方式来描述它,所以 Google 没有帮助。
这是一个代码片段,可以看出我在说什么。阻止编译的部分在评论中指出。
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;
};
甲板.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];
}
}
我需要用 0 到 51 的范围实例化 uniform_int_distribution
来洗牌。我可以将其声明为指针并动态分配它,但这似乎没有必要。
根据 C 语言的经验,我正在努力学习编写良好的、惯用的 C++ 代码,所以您能指出的任何其他内容都将不胜感激。当然,一旦我可以编译,就会调试 shuffling 的实际工作。
感谢您的任何回答。
最佳答案
您可以使用大括号,或复制初始化语法。
或者,您可以在每个构造函数的成员初始化列表中初始化该成员。
对于 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 )
{}
关于c++ - 在头文件中定义成员对象时调用非空构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049300/