无法将参数 1 从派生指针转换为基类指针引用

use*_*898 2 c++ inheritance

我有从基类继承的类,然后我有除了作为对基类的参数指针引用之外的方法。当我尝试将继承的对象传递给方法时,我得到:

c++ 无法将参数 1 从 'ReelSymbol *' 转换为 'Sprite *&'

Sprite 是框架基类

class ReelSymbol :public Sprite 
{
    public:
          ReelSymbol();
          ~ReelSymbol();

};
Run Code Online (Sandbox Code Playgroud)

这是我尝试将 ReelSymbol 对象指针传递给的方法

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)
{
    //DOTO to think if to use scale or bounding box size
    sprite->setScale(pSettings->ReelSymbolScaleFactor);
}
Run Code Online (Sandbox Code Playgroud)

像这样 :

ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);
Run Code Online (Sandbox Code Playgroud)

并收到此错误:

c++ cannot convert parameter 1 from 'ReelSymbol *' to ' Sprite *&'
Run Code Online (Sandbox Code Playgroud)

Ale*_*ler 5

您想要做的问题是,如果它可以编译,那么该函数setSpriteReelsSymbolBoundingBoxSize可以将您传递的变量重置为 a Sprite*,但不是 aReelSymbol*

为了澄清这一点,请考虑以下内容(并假设它可以编译):

class NotAReelSymbol : public Sprite
{
};

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)
{
    sprite = new NotAReelSymbol;
}

ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);
Run Code Online (Sandbox Code Playgroud)

现在,原始sprite变量类型是什么ReelSymbol*外观和行为应该是什么样的?这应该说明为什么您尝试编译的代码无效并且编译器正确地拒绝编译它。

一个可能的解决方法可能是:

ReelSymbol* sprite = new ReelSymbol();
Sprite* sprite_base = sprite;
ut.setSpriteReelsSymbolBoundingBoxSize(sprite_base);
Run Code Online (Sandbox Code Playgroud)

如果你可以保证setSpriteReelsSymbolBoundingBoxSize不会将原始变量重置为不是 a 的东西ReelSymbol*,那么之后你可以这样做

sprite = dynamic_cast<ReelSymbol*>(sprite_base);
Run Code Online (Sandbox Code Playgroud)

但是,我发现更有可能的是,您不需要重置原始变量。相反,通过将参数声明为引用,您试图表达允许该函数更改指向的对象spirit。但由于它是一个指针变量,因此函数可以修改它,这一点已经很清楚了。因此,只需删除&- 符号即可使代码编译并按预期工作:

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* sprite);
Run Code Online (Sandbox Code Playgroud)