2015-03-21 3 views
2

У меня возникла странная проблема, по которой я не могу найти ответ, и подумал, что я могу спросить.Идентификатор C++ не найден в абстрактном классе

У меня есть абстрактный класс, который проверяет столкновение, который имеет функцию «обновления» и функции «updateX» и «updateY».

class MapCollidable { 
public: 
    MapCollidable(){} 
    ~MapCollidable(){} 

    void update(const units::Coordinate2D origin, const Rectangle& boundingBox, 
       Rectangle& collider, units::Coordinate delta, Level* level, 
       Direction direction, bool moveAlongSlopes=false); 

    void updateX(const Rectangle& destRect, const Rectangle& boundingBox, 
       units::Coordinate delta_x, Level* level, bool moveAlongSlopes=false); 
    void updateY(const Rectangle& destRect, const Rectangle& boundingBox, 
       units::Coordinate delta_y, Level* level, bool moveAlongSlopes=false); 


    virtual void onCollision(const CollisionTile::CollisionInfo& collisionInfo) = 0; 
    virtual void onDelta(const CollisionTile::CollisionInfo& collisionInfo) = 0; 
}; 

Прежде чем я бы просто ребенок вызвать функцию обновления, чтобы сделать проверки столкновений, но в последнее время решил, что я хотел бы добавить updateX и функции updateY. Теперь ребенок вызывает updateX и updateY, которые вызывают обновление. Однако, когда я пытаюсь вызвать обновление внутри updateX или updateY, я получаю сообщение об ошибке «Идентификатор» «undefined».

void updateX(const Rectangle& destRect, const Rectangle& boundingBox, 
      units::Coordinate delta_x, Level* level, bool moveAlongSlopes=false) { 

     // Get some things ready to call update... 
    const units::Coordinate2D origin = units::Coordinate2D(destRect.getLeft(), destRect.getTop()); 
    Direction direction = delta_x < 0 ? LEFT : RIGHT; 
    Rectangle collider (boundingBox.getLeft() + destRect.getLeft() + delta_x, 
     boundingBox.getTop() + destRect.getTop(), 
     direction == LEFT ? (boundingBox.getWidth()/2) - delta_x : (boundingBox.getWidth()/2) + delta_x, 
     boundingBox.getHeight()); 


    // Trying to call update here gives the error. 
    update(origin, boundingBox, collider, delta_x, level, direction, moveAlongSlopes); 
} 

я выбрал через него несколько раз, и я что-нибудь глупое, что я сделал не найти, так почему же не обновляют назвать?

ответ

4

Вы определяете вашу функцию, как если бы это была глобальная:

void updateX(const Rectangle& destRect, const Rectangle& boundingBox, 
      units::Coordinate delta_x, Level* level, bool moveAlongSlopes=false) { 
    //... 
} 

Изменить это:

void MapCollidable::updateX(const Rectangle& destRect, const Rectangle& boundingBox, 
      units::Coordinate delta_x, Level* level, bool moveAlongSlopes=false) { 
    //... 
} 

Призыв к update сигнализируется как ошибка, потому что нет такой функции в глобальном масштабе.

Кстати, именно поэтому я всегда ссылка любая функция член/переменной с помощью это.

Если вы написали это:

void updateX(const Rectangle& destRect, const Rectangle& boundingBox, 
       units::Coordinate delta_x, Level* level, bool moveAlongSlopes=false) { 
    //... 
    this->update(...); 
} 

Вы сразу получили следующее сообщение об ошибке:

Error: 'this' only allowed in non-static member functions.

И вы знаете, что вызывает эту ошибку. Без это, многие простые ошибки можно легко опустить.

+0

О, боже, спасибо. Я смотрел на него более получаса и совершенно не хватало этого. :) – Claytorpedo

+0

Хороший совет с 'this -> ...' –

+0

Еще одна интересная вещь о 'this': предположим, что у вас есть класс шаблона A и класс класса B, который наследуется от A. Внутри функций-членов B любой член от A должно быть явно указано через 'this'. В противном случае вы получите следующую ошибку (взятую из GCC 4.9) 'нет аргументов для« X », которые зависят от параметра шаблона, поэтому должно быть доступно объявление« X », где' X' - это имя некоторого члена функция/переменная. Что интересно, VC++ принимает такой код. Поэтому, избегая «этого», вы можете очень легко создать очень неуправляемый код. –

Смежные вопросы