矢量push_back随机发生

时间:2012-03-12 10:23:24

标签: c++ qt vector

在尝试在QT中实现棋盘游戏时,我有一个非常奇怪的错误。这是我第二次遇到同样的问题,现在我觉得是时候问这里了。

我仍然在游戏的逻辑部分,它有一个名为Field的类,以及一个名为Board的类。 Board类具有QVector < Field* > fields属性,它是Field指针的向量。这就是问题所在。我有一个函数,它应该用新的字段上传这个向量。这是我的来源,它很直接:

void Board::addFields()
{
    for(int i = 0; i<size; i++) //the board's size is size x size
    {
        for(int j = 0; j<size; j++)
        {
            Field * f = new Field();
            fields.push_back(f);
            //qDebug()<<i*size+j<<" "<<f;
        }
    }
    //qDebug()<<fields.size();
}

在我收到大量奇怪的错误之后,我决定向控制台写入实际元素数,实际元素的引用,以及在两个循环后向量的大小。

结果非常奇怪,我没有错误,但有时它添加了我的所有元素,有时它停在随机数量的元素,并且矢量的大小甚至没有像这样打印出来:

结果1(正常):

0 0xa173a8

...

24 0x701c18

25

结果2(每次使用不同数量的元素):

0 0xa173a8

...

12 0xa17548

//并且没有矢量大小,我假设函数得到了返回;因为某事

我用QVector和std :: vector尝试了它,它是一样的。如果有人知道,问题是什么,请告诉我!

谢谢,对不起我的英语!

修改

我的所有代码都在这里:

field.h:http://paste2.org/p/1937231

field.cpp:http://paste2.org/p/1937232

player.h:http://paste2.org/p/1937238

player.cpp:http://paste2.org/p/1937239

board.h:http://paste2.org/p/1937234

board.cpp:http://paste2.org/p/1937235

main.cpp:http://paste2.org/p/1937243

4 个答案:

答案 0 :(得分:1)

感谢大家的帮助,我找到了解决方案。

由于我正在构建一个窗口应用程序的逻辑部分,我开始了一个QT gui项目。它为我生成了一个main()函数:

QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();

我不知道这是什么,但因为我现在不需要任何窗口,我删除了代码,并将其替换为我的代码,并简单地返回0;在末尾。这必定会导致问题,因为当我再次将QApplication添加到代码中时:

QApplication a(argc, argv);
Board b(10);
return a.exec();

它就像一个魅力......

我不知道在这种情况下该怎么办,如果可以的话,我会向所有想要帮助的人说明问题。但无论如何,非常感谢你的帮助! :)

答案 1 :(得分:0)

键入new Field();时,会进行动态内存分配。返回的指针实际上非常随机,你不应该依赖它是顺序的。但通常这没问题。

  

在我收到大量奇怪的错误之后,我决定向控制台写入实际元素数,实际元素的引用,以及在两个循环后向量的大小。

您遇到了哪些错误?

答案 2 :(得分:0)

size是会员吗?根据我的经验,如果事情随机发生,那么98%的成员是由未被初始化的成员引起的。

答案 3 :(得分:0)

我不知道C ++中对象初始化的细节,但是

Board::Board(int size):size(size)
{
   playerOne = new Player("Player One");
   playerTwo = new Player("Player Two");
   newGame(this->size);
}

可能是麻烦的原因。实际上,newGame使用的fields没有明确初始化。所以尝试使用

 Board::Board(int size):size(size), fields(size*size) //or just fields()
 {
  ...
  }

告诉我们会发生什么。