Я испытываю некоторое «странное поведение» при заполнении векторного значения с помощью конструктора.C++ Нечетное поведение с вектором, заполненным конструктором
Итак, у меня есть этот класс блоков, который заполняет этот статический вектор, называемый blockList, всякий раз, когда вызывается конструктор.
static std::vector<Block*> blockList;
Block::Block(float x, float y)
: RectangleShape(sf::Vector2f(WIDTH, HEIGHT)) {
blockList.push_back(this);
setFillColor(sf::Color(221, 221, 221, 255));
setPosition(x, y);
}
Теперь, когда я заполняю значения в другом классе, я назвал «Игра»; в своем конструкторе:
Game::Game(sf::RenderWindow& window) {
// other code here
Block firstBlock(10, 10);
// possible more blocks here
}
, а затем попытаться нарисовать, он разбился. Кроме того, координаты этого блока печатаются как (x: 9.8439e-12, y: 9.84394e-12). Теперь то, что я пытался делать бросает его в методе Draw (который я знаю плохо, как это постоянно называют, но для целей отладки):
void Game::drawObjects() {
// draw other shapes here
Block oneBlock(50.0f, 50.0f);
std::cout << std::string(10, '-') << std::endl;
for (Block* block : Block::getBlockList()) {
std::cout << block->getPosition().x << " - " << block->getPosition().y << std::endl;
window->draw(*block);
}
std::cout << std::string(10, '-') << std::endl;
}
координат и рисунок работы объекта отлично (даже если вектор сильно заселен). Поэтому мне интересно, почему это происходит, и о возможном способе обойти это. Мне не нравится эта идея, но, возможно, у меня должен быть флаг, чтобы определить, были ли они созданы, а затем создать их в методе рисования?
Вы случайно не прочитали предупреждения компилятора? Они важны. –
Кроме того, вы не показываете никакого механизма, который удаляет блоки в своем деструкторе. Прекратите быть умным и просто добавьте метод :: Add и :: Remove. –
@DavidLively Нет никаких предупреждений, поскольку это кажется логической ошибкой. – Jujunol