Проблема наследования C ++

0

Недавно я делал игру в C++, и я столкнулся с трудностями при попытке использовать наследование.

То, что я пытаюсь сделать, это создать автомобили и игрока, который также является одной из форм автомобиля. Обе эти вещи требуют позиции x и y, метода для их получения и рендеринга. Поскольку я хочу, чтобы код имел хорошее качество, я хотел только написать этот код один раз. Я сделал часть этого в следующем файле Entity: http://pastebin.com/nceanyQD

Заголовок Entity: http://pastebin.com/CLTv9B0Y

Тогда у меня это в заголовке автомобиля: http://pastebin.com/T9v0WGKd

И, наконец, это в файле Car: http://pastebin.com/CJ5wnby5

Когда я запустил этот код, он даст несколько ошибок. Прежде всего в Player.h прямо под строкой Entity, говорящей мне: базовый класс Entity unifined.

Еще одна ошибка в игровом файле (который отображает и обновляет все) в следующем коде:

Car Game::getCarAtLocation(int x, int y)
{
    vector<Car>::iterator iter = cars.begin();

    for(iter = cars.begin(); iter != cars.end(); ++iter)
    {
        if(iter->getX() == x)
        {
            if(iter->getY() == y)
            {
                return *iter;
            }
        }
    }
    return NULL;
}

Это говорит мне, что getY и getX не являются членами Car. Тем не менее, те же getY и getX полностью работают в режиме "<< перегрузки в самом файле Car.

Наконец, последняя ошибка, которую я получаю в файле Entity.h, является переопределением типа "класс".

Что я делаю неправильно и как это исправить?

Если требуется какой-либо другой код, его можно скачать здесь. https://dl.dropboxusercontent.com/u/59067404/BalCab.zip

  • 4
    Вероятно , игроки имеют автомобили, а не будучи автомобилей.
  • 3
    Чтобы устранить ваши проблемы, пожалуйста, составьте контрольный пример . Если вы все еще не можете их решить, опубликуйте тестовый пример.
Показать ещё 3 комментария
Теги:
inheritance

2 ответа

1
Лучший ответ

Добавьте включить защитные устройства в файлы заголовков или

#pragma once 

в начале заголовков

Файл Entity.h - это переопределение типа класса.

означает, что компилятору представлен текст

class Entity { [...] };

больше чем единожды.

Вы можете представить инструкцию include как copy-paste. Все, что вы пишете в

file.h

будет скопировано в любой файл, который имеет оператор

#include "file.h"

когда вы вызываете компилятор (нажмите кнопку build/make в вашей среде IDE)

Если у вашего исходного файла есть

#include "Car.h"
#include "Entity.h"

теперь у компилятора будет две копии вашего определения Entity.

2

Вторая ошибка проста - итератор должен быть "const", потому что getY() и getX() имеют константный модификатор.

vector<Car>::const_iterator iter = cars.begin();

В классе Car в режиме перегрузки << работает, потому что аргумент Car "const"

friend ostream& operator<<(ostream& os, const Car car);

И почему в Car.cpp меняют подпись перегруженного оператора, вы пишете:

ostream& operator<<(ostream& os, Car car) ......

должен быть таким же, как декларация

ostream& operator<<(ostream& os, const Car car)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню