Вектор push_back происходит случайно - PullRequest
0 голосов
/ 12 марта 2012

У меня довольно странная ошибка при попытке реализовать настольную игру в 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, это одно и то же. Пожалуйста, если кто-то понял, в чем может быть проблема, скажите мне!

Спасибо, и извините за мой английский!

EDIT

Весь мой код здесь:

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 ]

1 голос
/ 16 марта 2012

Спасибо всем за помощь, я нашел решение.

Так как я делал логическую часть оконного приложения, я запустил проект 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();

Это сработало как прелесть ...

Я не знаю, что делать вВ этом случае, если бы я мог, я бы дал точку зрения всем вам, кто пытался помочь.Но в любом случае, большое спасибо за помощь!:)

0 голосов
/ 12 марта 2012

Является ли size членом?по моему опыту, если что-то случается случайным образом, это на 98% вызвано не инициализированными членами ..

0 голосов
/ 12 марта 2012

Я не знаю деталей инициализации объекта в 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()
 {
  ...
  }

и скажите нам, что происходит.

0 голосов
/ 12 марта 2012

Когда вы набираете new Field();, вы делаете динамическое выделение памяти. Возвращенный указатель на самом деле довольно случайный, и вы не должны полагаться на него, чтобы он был последовательным. Но обычно это не проблема.

И после того, как я получил массу странных ошибок, я решил записать в консоль фактическое количество элементов, ссылку на фактический элемент, а после двух циклов - размер вектора.

Какие именно ошибки вы испытываете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...