1

私はまだC++を初めて使用しており、他の場所で正確な答えを見つけることができないようです。コンストラクターで2つのfloatを必要とするBoxオブジェクトを初期化しようとしています。Boxはゲームオブジェクトから派生しています。

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

Aは位置を初期化する必要があり、その情報なしでをGameObject作成することはできません。GameObjectABoxはaの用語で実装さ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ことを示すコンストラクターを追加することもできます。 Box0,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

1つの修正は、クラスのコンストラクターを定義することですBox


あなたがそれにいる間、あなたはおそらくpublic継承を使いたいでしょう。

class継承の場合はデフォルトprivateです(の場合は逆ですstruct)。

継承を使用していることに気付いた場合はprivate、代わりに封じ込めを検討してください。


また、たとえばリテラル3.14は、doubleではなく、であるfloatため、通常は。doubleの代わりに使用することをお勧めしますfloat

より速くなる可能性があります。

そして、それは確かにそれほど厄介ではありません。

于 2013-01-01T07:10:17.787 に答える