1

我还是 C++ 的新手,我似乎无法在其他地方找到确切的答案。我正在尝试在构造函数中初始化一个需要 2 个浮点数的 Box 对象。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;};

        };
4

2 回答 2

4

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

您需要创建一个构造函数来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 ) {}

    /*...*/
};
于 2013-01-01T07:10:11.113 回答
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可以使用。

一种解决方法是为 class 定义一个构造函数Box


当您使用它时,您可能想要使用public继承。

默认情况下为class继承(与 for 相反)。privatestruct

无论您发现自己在哪里使用private继承,都应考虑包含。


此外,由于例如文字3.14是 a double,而不是 a ,因此使用而不是.float通常是一个好主意。doublefloat

它可以更快。

而且它肯定不那么尴尬。

于 2013-01-01T07:10:17.787 回答