我正在尝试使指针指向某个向量,但在函数结束后,调试器显示指针不再指向该指针。 相关代码如下:
#pragma once
#include "Configuration.h"
#include "Enemy.h"
class FireBall:public sf::Sprite{
public:
FireBall(const sf::Vector2f position, Tile * startTile);
void moveFB();
void setTrail(vector<Tile *> *trail);
void removeTrail();
private:
sf::Vector2f _position;
vector<Tile *> *_p2_trail;
vector<Tile *>::iterator _it2Tile;
sf::Clock _clock;
int _lastMoveTime;
float getDecimalPart(float number);
};
void FireBall::setTrail(vector<Tile *> *trail){
_p2_trail = trail; // here it points to the vector (SHOULED REMAIN LIKE THAT AFTER FUNCTION ENDS....)
_it2Tile = _p2_trail->begin(); // setting iterator to begin
}
void GameBoard::setFireBall(bool set, float x, float y){
if (set)
_p2FB = new FireBall(sf::Vector2f((float)x*OFFSET,(float)y*OFFSET), _gameBoard[x][y]);
else{
_p2FB->removeTrail();
delete _p2FB;
}
_hasFireBall = set;
_p2FB->setTrail(&_player->getTrail());
// at this point _p2FB no more points to the vecotr! why?!!
}
玩家头: #pragma一次 #include“Configuration.h” #include“Character.h”
class Player:public Character{
public:
Player(vector< vector <Tile *>> &gameBoard, const sf::Vector2f position, const IMAGE img);
bool isLegalMove(const sf::Vector2f &position);
void move(sf::Vector2f &direction, Tile ** previousTile, Tile ** currentTile);
void act();
void setShielded(const bool shieldMode){ _sheilded = shieldMode; };
bool getShielded() const {return _sheilded; };
vector<Tile *> getTrail(){ return _trail; };
void addToTrail(Tile * tile);
void convertTrailToShield();
void removeTrail();
void fixBoardPosition();
void updateShielded(const pair<int,int>& prevPosition);
private:
bool _sheilded;
vector<Tile *> _trail;
};
答案 0 :(得分:3)
Player :: getTrail()返回一个类型为“vector”的临时对象,您可以使用其指针并使用_p2FB-&gt; setTrail()调用进行存储。在这种情况下,临时的生命周期只到表达式的结尾。因此,指针Fireball :: _ p2_trail在setTrail调用之后无效。
答案 1 :(得分:1)
在setFireBall()
如果set
为false,则删除_p2FB
,然后在2行之后通过调用setTrail()
来使用它。你正在删除指针上调用一个方法。
此外,游戏是多线程的吗?可能是一个不同的线程正在修改/删除玩家的向量,当你得到它的指针和调试器说它无效时?
答案 2 :(得分:0)
如果构造函数调用set trail,那么不要在堆栈上设置向量, 尝试将其放入堆中并传递指针。 最好使用指针与堆上的对象而不是堆栈上的对象。 如果它在堆栈上并且您尝试保存指向它的指针,则当它的作用域结束时它将被释放。