C++ 如何将实现接口的类的成员传递给使用该接口的另一个类?

C++ 如何将实现接口的类的成员传递给使用该接口的另一个类?,c++,inheritance,interface,encapsulation,C++,Inheritance,Interface,Encapsulation,我只是在试验接口和包装类,我遇到了一个障碍。我将SFML::RenderWindow包装在一个实现draw()函数的类中。例如: struct ISprite { .... functions for sprites... .... } class SFML_Sprite : public ISprite { public: .... functions implementing stuff for sprites .... private:

我只是在试验接口和包装类,我遇到了一个障碍。我将SFML::RenderWindow包装在一个实现draw()函数的类中。例如:

struct ISprite {
    ....
    functions for sprites...
    ....
}

class SFML_Sprite : public ISprite
{
public:
    ....
    functions implementing stuff for sprites
    ....

private:
    sf::Sprite mSprite;

} 

struct IWindow {
    ...
    virtual void draw(const ISprite& sprite) = 0;
    ...
}

class SFML_Window : public IWindow
{
public:
    ...
    void draw(const ISprite& sprite)
    {
         //This is where the problem is.  Is there a way for me to get to
         //mSprite? 
         mWin.draw(sprite.mSprite);
    }
private:
    sf::RenderWindow mWin;
}
换句话说,有没有一种方法可以让我传递潜在的东西?我缺少的模式?我基本上是想隐藏windows和sprite的实现。最后,我想尝试“交换”实现并降低一点级别,但如果我不能弄清楚这一点,我还没有准备好尝试


谢谢

你为什么不想做演员?在这种情况下,它是安全的,并且定义良好:

class ISprite {
};

class SFML_Sprite : public ISprite
{
};

class IWindow {
public:
    virtual void draw(const ISprite& sprite) = 0;
};

class SFML_Window : public IWindow
{
public:
    void draw(const ISprite& _sprite)
    {
       auto sprite = static_cast<const SFML_Sprite&>(_sprite);
    }
};

int main() {
   SFML_Window i;
   IWindow &a = i;

   SFML_Sprite x;
   ISprite &y = x;

   a.draw(y);
   return 0;
}
class-ISprite{
};
类SFML_精灵:公共ISprite
{
};
IWindow类{
公众:
虚拟虚空绘制(常量ISprite和sprite)=0;
};
类SFML_窗口:公共iWindows
{
公众:
无效绘制(常量ISprite和\u sprite)
{
自动精灵=静态投射(_精灵);
}
};
int main(){
SFML_窗口i;
IWindow&a=i;
雪碧x;
ISprite&y=x;
a、 绘制(y);
返回0;
}

如果您想付费进行运行时检查以确保获得正确的类型,您可以使用dynamic_cast,但您应该始终这样做,因为您不会在同一代码中混合两个不同的图形后端。

为什么不进行此转换?在这种情况下,它是安全的,并且定义良好:

class ISprite {
};

class SFML_Sprite : public ISprite
{
};

class IWindow {
public:
    virtual void draw(const ISprite& sprite) = 0;
};

class SFML_Window : public IWindow
{
public:
    void draw(const ISprite& _sprite)
    {
       auto sprite = static_cast<const SFML_Sprite&>(_sprite);
    }
};

int main() {
   SFML_Window i;
   IWindow &a = i;

   SFML_Sprite x;
   ISprite &y = x;

   a.draw(y);
   return 0;
}
class-ISprite{
};
类SFML_精灵:公共ISprite
{
};
IWindow类{
公众:
虚拟虚空绘制(常量ISprite和sprite)=0;
};
类SFML_窗口:公共iWindows
{
公众:
无效绘制(常量ISprite和\u sprite)
{
自动精灵=静态投射(_精灵);
}
};
int main(){
SFML_窗口i;
IWindow&a=i;
雪碧x;
ISprite&y=x;
a、 绘制(y);
返回0;
}

如果您想付费进行运行时检查,以确保获得正确的类型,您可以使用dynamic_cast,但您应该始终使用dynamic_cast,因为您不会在同一代码中混合两个不同的图形后端。

哦,我正在尝试避免使用cast。我想这可能行得通,还没有检查过,但如果可以的话,我不想这样做。
Isprite
是否有一个名为
mSprite
的成员?我可能敢说,对于这项工作来说,继承是错误的工具
IWindow
表示它适用于所有类型的精灵,因此
SFML_Window:IWindow
也承诺它适用于所有类型的精灵。但它看起来不像。也许您应该使用模板:
template struct IWindow{…};类SMFL_窗口:公共iWindows{…}@cigien-不-没有。我只是想说明这就是我想要实现的。我试图在包装器或接口中“隐藏”sfml位,以便最终更改implementation@HTNW通过制作SFML_Window::draw是SFML_Sprite的一个朋友,并使用一个static_cast:mWindow.draw(static_cast(&Sprite)->mSprite),我可以让它正常工作;但这感觉有点不对劲。我将尝试一下模板的想法。哦,我正在努力避免铸造。我想这可能行得通,还没有检查过,但如果可以的话,我不想这样做。
Isprite
是否有一个名为
mSprite
的成员?我可能敢说,对于这项工作来说,继承是错误的工具
IWindow
表示它适用于所有类型的精灵,因此
SFML_Window:IWindow
也承诺它适用于所有类型的精灵。但它看起来不像。也许您应该使用模板:
template struct IWindow{…};类SMFL_窗口:公共iWindows{…}@cigien-不-没有。我只是想说明这就是我想要实现的。我试图在包装器或接口中“隐藏”sfml位,以便最终更改implementation@HTNW通过制作SFML_Window::draw是SFML_Sprite的一个朋友,并使用一个static_cast:mWindow.draw(static_cast(&Sprite)->mSprite),我可以让它正常工作;但这感觉有点不对劲。我将尝试一下模板的想法。主要是因为它“感觉不正确”,但在这种情况下,它可能是好的。最后,我想用我自己的代码进行实验,从xcb、opengl制作windows,然后升级到vulkan,等等——然后我会编写这些代码,这样就不需要强制转换,因为这比sfml低一两级。我还想尝试编写共享库来交换功能,渲染就是其中之一,我认为它既有用又有趣。谢谢主要是因为它“感觉不对”,但在这种情况下,它可能是好的。最后,我想用我自己的代码进行实验,从xcb、opengl制作windows,然后升级到vulkan,等等——然后我会编写这些代码,这样就不需要强制转换,因为这比sfml低一两级。我还想尝试编写共享库来交换功能,渲染就是其中之一,我认为它既有用又有趣。谢谢