C++ 实现draw函数时从派生类进行的SFML不明确转换

C++ 实现draw函数时从派生类进行的SFML不明确转换,c++,inheritance,sfml,ambiguous,C++,Inheritance,Sfml,Ambiguous,我正在尝试创建自己的游戏引擎,其中每个基本的是一个GameObject,它将由一个更新功能和其他通知程序组成 以下是我目前的代码: #include <SFML/Audio.hpp> #include <SFML/Graphics.hpp> #include "AssetManager.hpp" class GameObject : public sf::Drawable, public sf::Transformable { public: virtual voi

我正在尝试创建自己的游戏引擎,其中每个基本的是一个
GameObject
,它将由一个更新功能和其他通知程序组成

以下是我目前的代码:

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "AssetManager.hpp"

class GameObject : public sf::Drawable, public sf::Transformable
{
public:
  virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
    target.draw(*this, states);
  };
};

class Sprite : public GameObject, public sf::Sprite {
public:
  Sprite(AssetManager assetManager, std::string assetName) : sf::Sprite(){
    setTexture(assetManager.getTextureNamed(assetName));
  }
};


int main(int argc, char const** argv)
{
  sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
  AssetManager assetManager = AssetManager("/Users/iProgram/Desktop/My Game Engine/My Game Engine");
  assetManager.loadTextureWithName("tank", "tank.png", sf::Vector2f(16,16));

  Sprite tank = Sprite(assetManager, "tank");

  while(window.isOpen()){
    window.clear();
    window.draw(tank);
    window.display();
  }

  return EXIT_SUCCESS;
}
#包括
#包括
#包括“AssetManager.hpp”
类游戏对象:公共sf::可绘制,公共sf::可转换
{
公众:
虚拟空心绘制(sf::RenderTarget&target,sf::RenderStates状态)常量{
目标。绘制(*此,状态);
};
};
类精灵:公共游戏对象,公共sf::精灵{
公众:
精灵(AssetManager AssetManager,std::string assetName):sf::Sprite(){
setTexture(assetManager.getTextureNamed(assetName));
}
};
int main(int argc,字符常量**argv)
{
sf::RenderWindow窗口(sf::VideoMode::getDesktopMode(),“”);
AssetManager AssetManager=AssetManager(“/Users/iProgram/Desktop/My Game Engine/My Game Engine”);
assetManager.loadTextureWithName(“tank”,“tank.png”,sf::Vector2f(16,16));
雪碧罐=雪碧(资产管理器,“罐”);
while(window.isOpen()){
window.clear();
窗.拉(槽);
window.display();
}
返回退出成功;
}
请注意,资产管理器只是将纹理存储在内存中,并在需要时返回给定大小的纹理

问题就在这行:
window.draw(坦克),我得到了错误

从派生类“const Sprite”到基类“const sf::Drawable”的转换不明确:


为什么会这样,因为我已经在
GameObject
类中实现了draw函数,如何修复它?

您的
Sprite
类继承自
GameObject
,它继承自
sf::Drawable
。您的类还继承自
sf::Sprite
,Sprite也继承自
sf::Drawable
。现在您的
Sprite
类有2个继承的
sf::Drawable
子对象,编译器无法选择


要解决这个问题,要么重新考虑您的设计,要么虚拟继承。

要解决这个问题,我不必像一些人建议的那样使用私有继承,我只需要我的基类(GameObject)不继承任何内容。然后,我的Sprite类将继承
sf::Sprite
,如下所示:

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "AssetManager.hpp"

class GameObject{
public:
  virtual void update(){}
};

class Sprite : public GameObject, public sf::Sprite {
public:
  Sprite(AssetManager* assetManager, std::string assetName) : sf::Sprite(assetManager->getTextureNamed(assetName)){
  }
};

class Tank: public Sprite{
public:
  Tank(AssetManager* assetManager) : Sprite(assetManager, "tank"){
    setScale(3, 3);
  };

  virtual void update(){
    move(1,0);
  }
};

int main(int argc, char const** argv)
{
  sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
  AssetManager* assetManager = new AssetManager("/Users/iProgram/Desktop/My Game Engine/My Game Engine");
  assetManager->loadTextureWithName("tank", "tank.png", sf::Vector2f(16,16));

  Tank tank = Tank(assetManager);
  while(window.isOpen()){
    sf::Event event;
    while(window.pollEvent(event)){
      if(event.type == sf::Event::Closed){
        window.close();
      }
    }
    tank.update();
    window.clear();
    window.draw(tank);
    window.display();
  }

  return EXIT_SUCCESS;
}
#包括
#包括
#包括“AssetManager.hpp”
类游戏对象{
公众:
虚拟空更新(){}
};
类精灵:公共游戏对象,公共sf::精灵{
公众:
精灵(AssetManager*AssetManager,std::string assetName):sf::精灵(AssetManager->GetTextureName(assetName)){
}
};
等级:公共雪碧{
公众:
坦克(AssetManager*AssetManager):精灵(AssetManager,“坦克”){
设置刻度(3,3);
};
虚拟空间更新(){
move(1,0);
}
};
int main(int argc,字符常量**argv)
{
sf::RenderWindow窗口(sf::VideoMode::getDesktopMode(),“”);
AssetManager*AssetManager=new AssetManager(“/Users/iProgram/Desktop/My Game Engine/My Game Engine”);
assetManager->loadTextureWithName(“tank”,“tank.png”,sf::Vector2f(16,16));
储罐=储罐(assetManager);
while(window.isOpen()){
sf::事件;
while(window.pollEvent(事件)){
如果(event.type==sf::event::Closed){
window.close();
}
}
tank.update();
window.clear();
窗.拉(槽);
window.display();
}
返回退出成功;
}

sf::Sprite
继承自
sf::Drawable
,因此
Sprite
有两个
sf::Drawable
子对象,分别具有
draw
函数。我将
类游戏对象:public sf::Drawable,public sf::Transformable
更改为
类游戏对象:public virtual sf::Drawable,公共sf::Transformable
并且我仍然得到从派生类“const Sprite”到基类“const sf::Drawable”的模糊转换:
我需要做什么?你也需要虚拟地继承另一个,因为htat是不可能的库代码,你需要找到另一个way@iProgram作为建议,您可以将一个
sf::Sprite
作为
GameObject
的成员。这样
GameObject
就可以从
sf::Drawable
继承。在
draw
函数中,您只需绘制精灵,以及其他任何东西。