指针从另一个类返回

时间:2015-10-11 20:00:24

标签: c++

好吧,在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个骰子

2 个答案:

答案 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));

Live demo

相关问题