2012-03-12 131 views
0

我试图在QT中实现棋盘游戏时出现了一个非常奇怪的错误。这是我第二次,有同样的问题,现在我想是时候在这里问问了。向量push_back随机发生

我还在游戏的逻辑部分,它有一个名为Field的类和一个名为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(); 
} 

后,我得到了一吨奇怪的错误,我决定写控制台元素的实际数量,实际元素的参考,并经过两个循环的矢量大小。

结果是很奇怪,我没有错误,但somtimes它加了我所有的元素,有时停在元素的随机数,甚至得到了打印出来这样的载体犯规的大小:

结果1(正常):

0 0xa173a8

...

24 0x701c18

结果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

球员。 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

+0

如何以及在哪里'fields'声明? – UmNyobe 2012-03-12 10:26:05

+0

字段在Board类中声明为私有属性。 (私人:QVector 字段;) – 2012-03-12 10:29:26

+0

你能发布更多的代码吗?你得到了哪些奇怪的错误,他们在哪里? – UmNyobe 2012-03-12 10:31:13

回答

0

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

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

你正在经历什么错误?

+0

我试图访问矢量元素时出现错误。但是,因为他们并不总是被添加,所以会产生错误。现在我不尝试访问元素,所以我没有得到任何错误。 – 2012-03-12 10:53:27

0

size的会员吗?从我的经验,如果事情随机发生它的98%的未初始化的成员造成的..

+0

是的,它是董事会成员。 – 2012-03-12 10:55:18

+0

看看你是否正在做一个好的初始化.. – 2012-03-12 10:58:34

+0

你确定'Board :: Board(int size):size(size)'东西不会产生问题吗?使用不同的名称进行初始化...... – 2012-03-12 11:02:08

0

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

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

可能是故障的原因。的确,新游戏使用的是没有明确初始化的fields。所以请尝试使用

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

并告诉我们会发生什么。

+0

我尝试过:Board :: Board(int s):size(s),fields(s * s){...} 仍然一样... :( – 2012-03-12 11:16:59

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(); 

它的工作就像一个魅力...

我不知道在这种情况下做的,如果我可以,我会向所有你想要帮助的人提点意见。但无论如何,非常感谢您的帮助! :)