Недавно я делал игру в 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
Добавьте включить защитные устройства в файлы заголовков или
#pragma once
в начале заголовков
Файл Entity.h - это переопределение типа класса.
означает, что компилятору представлен текст
class Entity { [...] };
больше чем единожды.
Вы можете представить инструкцию include как copy-paste. Все, что вы пишете в
file.h
будет скопировано в любой файл, который имеет оператор
#include "file.h"
когда вы вызываете компилятор (нажмите кнопку build/make в вашей среде IDE)
Если у вашего исходного файла есть
#include "Car.h"
#include "Entity.h"
теперь у компилятора будет две копии вашего определения Entity.
Вторая ошибка проста - итератор должен быть "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)