我有从基类继承的类, 然后我有方法,作为参数指针引用基类除外。 当我尝试将继承的对象传递给我获取的方法时:
c ++无法将参数1从'ReelSymbol *'转换为'Sprite *&'
Sprite是框架工作基类
class ReelSymbol :public Sprite
{
public:
ReelSymbol();
~ReelSymbol();
};
这是我尝试将ReelSymbol对象指针传递给
的方法void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)
{
//DOTO to think if to use scale or bounding box size
sprite->setScale(pSettings->ReelSymbolScaleFactor);
}
像这样:
ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);
并收到此错误:
c++ cannot convert parameter 1 from 'ReelSymbol *' to ' Sprite *&'
答案 0 :(得分:4)
您尝试做的事情的问题是,如果它会编译,那么函数setSpriteReelsSymbolBoundingBoxSize
可以将您传递的变量重置为Sprite*
,但不是ReelSymbol*
。
为了澄清,请考虑以下内容(假装它会编译):
class NotAReelSymbol : public Sprite
{
};
void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)
{
sprite = new NotAReelSymbol;
}
ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);
现在,sprite
类型的原始ReelSymbol*
变量看起来和表现如何?这应该说明为什么你试图编译的代码无效并且编译器正确拒绝编译它。
可能的解决方法可能是:
ReelSymbol* sprite = new ReelSymbol();
Sprite* sprite_base = sprite;
ut.setSpriteReelsSymbolBoundingBoxSize(sprite_base);
如果您可以保证setSpriteReelsSymbolBoundingBoxSize
不会将原始变量重置为非ReelSymbol*
的内容,那么之后就可以
sprite = dynamic_cast<ReelSymbol*>(sprite_base);
但是,我发现更有可能的是,您不需要重置原始变量。相反,通过将参数声明为引用,您试图表示允许该函数更改spirit
指向的对象。但由于它是指针变量,它已经很清楚,该函数可以修改它。因此,只需删除&
- 符号即可使代码编译并按预期工作:
void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* sprite);
答案 1 :(得分:2)
这里唯一的问题是你的指针引用
Sprite* &sprite
没有必要将它作为参考,因为你已经有了指针。 像这样:
Sprite* sprite
您的编译器会自动将其强制转换为您所期望的基类“Sprite”