在尝试在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
答案 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()
{
...
}
告诉我们会发生什么。