好的......我现在至少花了一个小时摔跤这个错误。我的StaticSprite类继承自我的Component类。但是,当我尝试实例化StaticSprite实例时,我收到错误c2016。
这是我的相关代码,如果需要,我会发布更多内容。 提前谢谢。
#ifndef STATICSPRITE_H_
#define STATICSPRITE_H_
#include "Component.h"
#include <SFML/Graphics.hpp>
#include <string>
namespace GE
{
class Entity;
class Component;
class StaticSprite : public Component
{
private:
sf::Image image;
public:
sf::Sprite Sprite;
StaticSprite();
StaticSprite(std::string filename);
};
}
#endif
#ifndef COMPONENT_H_
#define COMPONENT_H_
#include "Entity.h"
#include "ComponentType.h"
#include <iostream>
namespace GE
{
class Entity;
class Component
{
protected:
Entity* myEntity;
TYPE type;
public:
Component();
virtual ~Component() {}
Entity* getEntity();
};
}
#endif
int main(int argc, char* argv[])
{
Entity Player;
//The first arg is just a number, and the second is the
//actual component to add to the Entity's component array
Player.addComponent(StaticSprite, new StaticSprite()); //error
//application loop
}
//TYPE is just an enumerated type
void Entity::addComponent(TYPE type, void* component)
{
Components[type] = component;
}
#ifndef COMPONENTTYPE_H_
#define COMPONENTTYPE_H_
namespace GE
{
enum TYPE{Base = 0, StaticSprite, DynamicSprite,
Physics, Collision, Input, Particle, Audio, Scriptable, MaxType};
}
#endif
答案 0 :(得分:2)
如果你包括class Component;
,声明Component.h
的重点是什么?你不能从一个不完整的类型继承,所以这个声明是没有意义的。
一个疯狂的猜测是循环包含问题,但如果没有更多信息,这真的很难说。如果您对该主题不清楚,我建议您在使用C和C ++组织代码文件中阅读this article。
编辑:
Player.addComponent(StaticSprite, new StaticSprite());
您无法将类型 StaticSprite
传递给方法。这可能是错误的根源。向我们展示addComponent
的声明。第一个参数类型是什么?
编辑:
void Entity::addComponent(TYPE type, void* component)
好的,那么TYPE
的定义是什么?我想这只是int
或类似的typedef?在这种情况下,应该清楚的是,您无法将类型StaticSprite
分配给int
。
编辑:
是的,你有它。 枚举器enum TYPE{Base = 0, StaticSprite, DynamicSprite, Physics, Collision, Input, Particle, Audio, Scriptable, MaxType};
TYPE::StaticSprite
与类型 StaticSprite
完全无关,即使它们具有相同的名称。给枚举器一些其他名称,例如T_StaticSprite
,以下代码应该起作用:
Player.addComponent(T_StaticSprite, new StaticSprite());
(整个类型枚举是否是一个好主意是一个不同的问题。)