好吧,在A组我有:
int* attackerDice;
int* defenderDice;
这两个变量调用另一个名为dice的类。所以:
attackerDice = dice.roll()
defenderDice = dice.roll()
dice.roll的作用如下:
int* Dice::roll () {
int* ran = new int[1];
srand(time(NULL));
ran[0] = rand()%6+1;
std::sort(ran,ran+1);
return ran;
}
现在我遇到的问题是攻击者骰子正在返回-43249211234,而后卫骰子正在返回正确的数字。我认为这是因为我显然不明白何时使用*和&amp ;.任何人都可以帮助我吗?
编辑: 如果我想要一个阵列,我将如何做到这一点?我想拥有它以便我可以滚动X个骰子
答案 0 :(得分:3)
我的水晶球说Dice
不遵守Rule Of Three。
由于指针管理不当以及指向对象的生命周期,看起来你有未定义的行为。
在大多数情况下,C ++不需要使用指针。
不要在C ++中编写
new
请参阅杰弗里的回答,了解如何避免终身问题。
好多了。注意:每次通过循环实例化一个新的随机生成器是非常不理想的,并且使用这样的均匀分布是有缺陷的。相反,做:
auto dice = bind(uniform_int_distribution<>(1,6), mt19337 { random_device{}() });
现在你可以打电话
int roll1 = dice(); // roll1 = [1..6]
只要您使用相同的dice
对象
答案 1 :(得分:2)
几乎所有关于代码的内容都不是最理想的:
rand
被认为是&#34; evil&#34;已经有一段时间了。Dice
的任何成员对象作为其成员函数之一的算法。修订后的#34;理智&#34;解决方案如下:
namespace ex {
class dice {
private:
std::mt19937 gen;
std::uniform_int_distribution<> dis;
public:
dice(int to)
: gen(std::random_device()())
, dis(1, to)
{}
int roll() { return dis(gen); }
};
}
然后将用作以下内容:
constexpr int count = 10;
std::vector<int> rolls;
rolls.reserve(count);
ex::dice dice(6);
std::generate_n(back_inserter(rolls), count, std::bind(&ex::dice::roll, dice));