最近我一直用C ++制作游戏,在尝试使用继承时遇到了麻烦。
我要做的是创造汽车和玩家,这也是某种形式的汽车。这两个都需要一个x和y位置,一个获取它们的方法和一个渲染。由于我希望代码具有良好的质量,我想只编写一次该代码。我在以下实体文件中做了部分内容:http://pastebin.com/nceanyQD
实体标题:http://pastebin.com/CLTv9B0Y
然后我在Car标题中有这个:http://pastebin.com/T9v0WGKd
最后在Car文件中:http://pastebin.com/CJ5wnby5
当我运行此代码时,它会产生一些错误。首先在实体行右下方的Player.h中告诉我:实体基类是未分解的。
以下代码中的游戏文件中的另一个错误(呈现并更新所有内容):
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在运算符中完全正常工作&lt;&lt; Car文件本身过载。
最后,我在Entity.h文件中遇到的最后一个错误是'class'类型的redifinition。
我做错了什么,我该如何解决?
如果需要任何其他代码,可以在此处下载。 https://dl.dropboxusercontent.com/u/59067404/BalCab.zip
答案 0 :(得分:2)
第二个错误很简单 - 迭代器必须是“const”,因为getY()和getX()都有const修饰符。
vector<Car>::const_iterator iter = cars.begin();
在过载运算符的类Car中&lt;&lt;因为汽车参数“const”
而起作用friend ostream& operator<<(ostream& os, const Car car);
为什么在Car.cpp中改变你写的重载运算符的签名:
ostream& operator<<(ostream& os, Car car) ......
必须与声明
相同ostream& operator<<(ostream& os, const Car car)
答案 1 :(得分:1)
将include guards添加到您的标头文件或放入
#pragma once
在标题的开头
Entity.h文件是'class'类型redtifinition。
表示编译器带有文本
class Entity { [...] };
不止一次。
您可以将include语句视为复制粘贴。你写的所有东西
file.h
将被复制粘贴到具有语句
的任何文件中#include "file.h"
调用编译器时(按IDE中的build / make按钮)
如果您的源文件现在有
#include "Car.h"
#include "Entity.h"
编译器现在有两个Entity定义副本的定义。