错误C2512:'Box':没有合适的默认构造函数可用

时间:2013-01-01 07:06:19

标签: c++

我还是C ++的新手,我似乎无法在其他地方找到确切的答案。我试图初始化一个Box对象,在构造函数中需要2个浮点数。 Box源自Game Object。

我试过Box * box = new Box(20,20);

    class GameObject {
        public: 
            GameObject::GameObject(float Posx, float Posy) {
                posx = Posx;
                posy = Posy;
            };
        protected: //Positions
            float posx;
            float posy;

            virtual void setPosition(float x, float y) { posx = x; posy = y;};

        };


        class Box : GameObject { // Box is Derived from GameObject
        public:

            float sizex;
            float sizey;

            void setSize(float x, float y) {sizex = x; sizey = y;};

        };

2 个答案:

答案 0 :(得分:4)

GameObject需要初始化一个位置,如果没有该信息,您根本无法创建GameObjectBox实现的 GameObject,因此Box也需要使用位置进行初始化。

您需要为Box创建一个构造函数,该构造函数将负责初始化其GameObject位置。像这样:

class Box : GameObject {
public:
    Box(float Posx, float Posy) : GameObject( Posx, Posy ) {}

    /*...*/
};

大概你需要一种方法来构建一个位置大小的Box

class Box : GameObject {
public:
    Box(float Posx, float Posy, float Sizex, float Sizey)
      : GameObject( Posx, Posy )
      , sizex( Sizex ), sizey( Sizey )
    {}

    /*...*/
};

最后,您还可以为Box添加一个构造函数,该构造函数表示默认构造 Box从位置0,0开始并且没有大小:

class Box : GameObject {
public:
    Box() : GameObject( 0, 0 ), sizex( 0 ), sizey( 0 ) {}

    /*...*/
};

答案 1 :(得分:1)

在我写这篇文章时,发布的代码如下:

class GameObject {


public: 
    GameObject::GameObject(float Posx, float Posy) {
        posx = Posx;
        posy = Posy;
    };
protected:
    float posx;
    float posy;

    virtual void setPosition(float x, float y) { posx = x; posy = y;};

};


class Box : GameObject {
public:

    float sizex;
    float sizey;

    void setSize(float x, float y) {sizex = x; sizey = y;};

};

这不会编译,因为类GameObject没有默认的构造函数,生成的类Box的默认构造函数可以使用。

一个解决方法是为类Box定义构造函数。


当你在这里时,你可能想要使用public继承。

默认情况下class继承为private(与struct相反)。

无论您发现自己使用private继承,请考虑包含。


此外,例如,文字3.14double,而不是float,使用double代替float通常是个好主意。

它可以更快。

这肯定不那么尴尬。