Почему нельзя использовать нестатический метод родительского класса для объектов классов потомков

Рейтинг: -1Ответов: 1Опубликовано: 20.02.2023

Возникла проблема при наследовании c++. Еще разбираюсь в ООП, но ситуация такая. Есть родительский класс Entity с нестатическим методом getrect(). Есть классы потомки для Entity, в данном случае Platform. Метод класса Entity getrect() не является статическим, то есть должен быть доступен в классах потомках просто по имени самого метода(так как является одинаковым для всех объектов классов потомков). Но по какой-то причине, выводит сообщение об неопределенном идентификаторе getrect() в реализации метода класса наследника. Прилагаю скрины ниже.

Заголовочный файл родительского класса:

    #pragma once
#include <SFML/Graphics.hpp>
using namespace sf;

class Entity
{
public:
    Texture texture;
    Sprite sprite;
    String name;
    int x, y;
    float w, h;
    
public:
    Entity(Image image, String Name, float x, float y, int w, int h);
    // Функция. Возвращает координаты, ширину и высоту персонажа
    FloatRect getRect();
    
};

А вот его реализация

#include "Entity.h"
Entity::Entity(Image image,String Name, float x, float y,int w, int h)
{
    texture.loadFromImage(image);
    sprite.setTexture(texture);
    sprite.setOrigin(w / 2, h / 2);
    sprite.setTextureRect(IntRect(0, 0, w, h));

}

// Функция. Возвращает координаты, ширину и высоту персонажа
FloatRect Entity::getRect() {
    return FloatRect(x, y, w, h);
}

Заголовочник класса наследника соответственно.

#pragma once
#include "Entity.h"
class Platform :public Entity
{
    float dx, dy, moveSpeed;
    enum stateObject {left, right, stay};
    stateObject state;
    Platform(float dx, float dy, float moveSpeed,stateObject state, Image image, String Name, float x, float y, int w, int h);
    void control(float time);
    void checkCollisionWithMap(float dx);
};

Реализация

#include "Platform.h"
#include "GameField.h"
Platform::Platform(float dx, float dy, float moveSpeed, stateObject state, Image image, String Name, float x, float y, int w, int h):Entity(image,Name,x,y,w,h)
{
    this->dx = dx;
    this->dy = dy;
    this->moveSpeed = moveSpeed;
    this->state = state;
}

void checkCollisionWithMap(float dx)
{
    // Обход всех объектов карты
    for (int i = 0; i < GameField::solidInvisibleobj.size(); i++)
        // При пересечении г.г и объектов карты
        if (getRect().intersects(obj[i].rect))
        {

            // Выталкивание персонажа из текстуры
            if (obj[i].name == "solid" || obj[i].name == "transporterR" || obj[i].name == "transporterL")
            {

                if (Dy > 0) { y = obj[i].rect.top - h;  moveY = 0; onGround = true; }
                if (Dy < 0) { y = obj[i].rect.top + obj[i].rect.height;   moveY = 0; }
                if (Dx > 0) { x = obj[i].rect.left - w; }
                if (Dx < 0) { x = obj[i].rect.left + obj[i].rect.width; }
            }
            // Передвижение г.г при пересечении с конвеерами
            if (obj[i].name == "transporterR")
            {
                collisTransporterR = true;
            }
            else
            {
                collisTransporterR = false;
            }
            if (obj[i].name == "transporterL")
            {
                collisTransporterL = true;
            }
            else
            {
                collisTransporterL = false;
            }
            if ((obj[i].name == "JumpPlatform") && (moveY > 0) && (onGround == false))
            {
                moveY = -0.8;
            }
            if (obj[i].name == "deathItem")
                health = 0;
            if (obj[i].name == "Exit")
                GoNextLevel = true;


        }
}

void Platform::control(float time)
{
    switch (state)
    {
    case Platform::left: dx = -moveSpeed;
        break;
    case Platform::right:dx = moveSpeed;
        break;
    case Platform::stay: dx = 0;
        break;
    };
    x += dx * time;
    
}

Ответы

▲ 0

При описании метода в файле реализации требуется указывать имя класса, к которому принадлежит метод void Platform::checkCollisionWithMap(float dx)