我在c ++论坛中阅读了关于标题的Disch文章 http://www.cplusplus.com/forum/articles/10627/
我这里的代码有点令人困惑
ResourceHolder.h
using namespace std;
template<typename Resource, typename Identifier>
class ResourceHolder{
public:
void load(Identifier id, const std::string &filename);
template<typename Parameter>
void load(Identifier id, const std::string &filename, const Parameter &secondParam);
Resource &get(Identifier id);
const Resource &get(Identifier id) const;
private:
void insertResource(Identifier id, std::unique_ptr<Resource> resource);
private:
std::map<Identifier, std::unique_ptr<Resource>> mResourceMap;
};
ResourceIdentifier.h
// Forward declaration of SFML classes
namespace sf
{
class Texture;
}
namespace Textures
{
enum ID
{
Eagle,
Raptor,
Desert,
};
}
// Forward declaration and a few type definitions
template <typename Resource, typename Identifier>
class ResourceHolder;
typedef ResourceHolder<sf::Texture, Textures::ID> TextureHolder;
Aircraft.h
#pragma once
#include "Entity.h"
#include "ResourceIdentifiers.h"
class Aircraft : public Entity
{
public:
enum Type{
Eagle,
Raptor
};
Aircraft(Type type, const TextureHolder& textures);
private:
virtual void drawCurrent(sf::RenderTarget &target, sf::RenderStates states) const;
private:
Type mType;
sf::Sprite mSprite;
};
我认为这是基于我读过的文章以正确的方式和错误的方式。
Aircraft.h
包括
ResourceIdentifier.h
包含
的前向声明ResourceHolder.h
在文章中说明如果要转发声明,则需要使用指向类的引用或引用类。
在我的代码中,他们使用前向声明但从不使用指向类的指针。它实际上是一个模板类
当我在我的Aircraft.cpp上出现关于不兼容类型
的错误时Aircraft.cpp
#include "Aircraft.h"
#include "ResourceHolder.h" // --------- I got an error if this is not included.
Textures::ID toTextureID(Aircraft::Type type){
switch (type)
{
case Aircraft::Type::Eagle:
return Textures::ID::Eagle;
case Aircraft::Type::Raptor:
return Textures::ID::Raptor;
}
return Textures::ID::Eagle;
}
void Aircraft::drawCurrent(sf::RenderTarget &target, sf::RenderStates states) const{
target.draw(mSprite, states);
}
Aircraft::Aircraft(Type type, const TextureHolder &textures) : mType(type), mSprite(textures.get(toTextureID(type))) //----------> this is where i get an error if ResourceHolder.h is not included. Error: Incompatible type
{
}
错误:
Incompatible type.
但这令人困惑。我包括了 ResourceIdentifier.h 有一个类前向声明 ResourceHolder.h , 在我的 Aircraft.h
为什么我会收到错误?一切都联系在一起。 ResourceHolder在不同的文件中也有自己的类声明,我没有在这里包含。但是每个班级都有一个宣言。
另外,texture是对ResourceIdentifier.h
上的模板类的引用。为什么我必须再次在Aircraft.cpp上声明ResourceHolder.h
?它已经在ResourceIdentifier.h
上课了。我没有使用任何模板类对象。这是一个参考。