使用this->

时间:2016-04-17 02:47:22

标签: c++ object

嗨,我正在做一个小项目tomy学校,并继续为我错误。

在调用我的对象中的一个方法时,此指针设置为 0xcdcdcdcd 。我用Google搜索并发现了一些关于在调用之前擦除内存或销毁对象的信息,但我确保之前没有调用过析构函数。

World.h

class Organism;
class Human;

class World
{
private:
   vector <Organism*> organisms;

   vector <Organism*> organismsToAdd;

   vector <string> logs;

   int turn_;

   void initializeWorld();

   void drawInterface();

   void drawInfo();
   void drawOrganisms();
   void nextTurn();
   bool isPositionTaken(int x, int y);
   Organism* getOrganism(int x, int y);
   void queueOrganismToAdd(Organism* newOrganism);
   void addQueuedOrganisms();
   void generateStartOrganisms();
   bool isPlayerAlive();
public:
   void executeMove(Organism* moving, int toX, int toY);  //here's the problem
   bool isPositionValid(int x, int y);
   World(int x, int y);
   struct
   {
       int x_, y_;
   } worldSize;
   void startGame();
   ~World();
 };

executeMove

void World::executeMove(Organism* moving, int toX, int toY)
{
   cout << moving->getSign();
   getch();
   if (!isPositionTaken(toX, toY))  //  <- here it brake
   {
       moving->setPosition(toX, toY);
   }
   else if (moving->getSign() == getOrganism(toX, toY)->getSign())
   {
    //multiply
    //make log
   }
   else {
      if (!moving->specialCollision((getOrganism(toX, toY)))) return;
      if (!getOrganism(toX, toY)->specialCollision(moving)) return;
      if (moving->getPower() >= getOrganism(toX, toY)->getPower())
      {
        //log
        //delete losser
       }
      else
      {
        //log
        //delete losser
       }
    moving->setPosition(toX, toY);
   }
}

isPositioinTaken

bool World::isPositionTaken(int x, int y)
{
    for (int i = 0; i < this->organisms.size(); ++i)  // here this is set to 0xcdcdcdcd
    {
        if (organisms[i]->getPositionX() == x && organisms[i]->getPositionY() == y) return true;

    }
    return false;
}

方法isPositionTaken在项目的其他部分很好用,所以如果发现什么错误我会完全丢失,我会提供任何帮助

1 个答案:

答案 0 :(得分:1)

由于organisms成员具有默认构造函数,因此在您指定的行中查看此行为的唯一方法是对executeMove()的调用是否使用未初始化的指针。

类似的东西:

World *ptr; // not initialized on stack
    ...
ptr->executeMove();

或者从另一个具有相同问题的方法调用此方法。