我有继承自基类的类, 然后我有一个方法,除了作为对基类的参数指针引用。 当我尝试将继承的对象传递给我得到的方法时:
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 *&'
最佳答案
您尝试做的事情的问题在于,如果它可以编译,那么函数 setSpriteReelsSymbolBoundingBoxSize
可能会将您传递的变量重置为 Sprite*
,但不是 ReelSymbol*
。
为了澄清,请考虑以下内容(并假装它会编译):
class NotAReelSymbol : public Sprite
{
};
void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)
{
sprite = new NotAReelSymbol;
}
ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);
现在,ReelSymbol*
类型的原始 sprite
变量看起来和行为应该是什么样的?这应该可以证明为什么您尝试编译的代码是无效的并且编译器正确地拒绝编译它。
可能的解决方法是:
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);
关于c++ - 无法将参数 1 从派生指针转换为基类指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22757035/