C ++将函数实现对象作为接口类型传递给它

时间:2016-11-26 06:45:14

标签: c++ interface

我的界面看起来像这样:

class GameObject
{
public:
    virtual ObjType getType() = 0;
    virtual void setType(ObjType ot) = 0;

protected:
    ObjType objtype;


};

然后我有实现此接口的类

class SpriteObject : public GameObject
{
    public:
        SpriteObject();
        virtual ~SpriteObject();        
        ObjType getType() { return objtype; }
        void setType(ObjType ot) { objtype = ot; }

    private:

};



class LayerObject : public GameObject
    {
        public:
            LayerObject ();
            virtual ~LayerObject ();        
            ObjType getType() { return objtype; }
            void setType(ObjType ot) { objtype = ot; }

        private:

    };

在主类中我有函数,我尝试将SpriteObject传递给 看起来像这样:

bool HelloWorld::NodeAction(GameObject* &pGameObj)
{
}

当我尝试做的时候:

SpriteObject *pSpriteObject = new SpriteObject();
NodeAction(pSpriteObject);

我收到此错误:

error C2664: 'bool HelloWorld::NodeAction(GameObject *&)' : cannot convert argument 1 from 'SpriteObject *' to 'GameObject *&'

最后,我希望拥有可以获得实现GameObject的不同对象的全局函数。

1 个答案:

答案 0 :(得分:2)

此功能:

bool HelloWorld::NodeAction(GameObject* &pGameObj)

期望非{cv左值引用GameObject*

由于pSpriteObjectSpriteObject *类型的左值,因此没有匹配函数来调用它,它将尝试使用implicit conversion通过这些转换来查找重载函数:

  • 左值转换的左值

      

    任何非函数非数组类型T的glvalue都可以隐式转换为相同类型的prvalue。如果T是非类类型,则此转换也会删除cv限定符。

  • 指针转换

      

    指向(可选cv限定的)派生类类型的prvalue指针可以转换为指向其(相同的cv限定的)基类的prvalue指针。

因此,这一行

NodeAction(pSpriteObject);

期望使用其中一个原型的函数:

bool HelloWorld::NodeAction(GameObject*)
bool HelloWorld::NodeAction(GameObject* const&)
bool HelloWorld::NodeAction(GameObject* &&)

一切都可以接受,但

bool HelloWorld::NodeAction(GameObject*)

应该是首选,请参阅this question。对于基本类型,即使在C ++ 11之前,pass by value也应该比pass-by-reference更快