4

でブレイクアウト ゲームのクローンを構築しようとしていQtます。QGraphicsItemボールが衝突したタイプを特定する必要があります。たとえば、ボールが壁に衝突した場合、ボールは跳ね返り、レンガに衝突した場合は跳ね返らなければならず、レンガを破壊します。それが何であるかを知るためにQGraphicsItem、おそらくオーバーライドするのが最善の方法であると考えましたQGraphicsItem::type()(これが正しい方法でない場合はお知らせください!)。

次のコードでbrick.hは、「Brick」のタイプを 3 に設定しています。ここで、値 3 を追跡するのは非常に面倒に見えます。代わりに、「#define」で何かを宣言することをお勧めします

#include <QGraphicsItem>

//should this #define be here?
//#define BRICK_SPRITE 3

class Brick : public QGraphicsItem
{
public:
    Brick(const QPixmap& p, QGraphicsScene *scene = 0);
    virtual QRectF boundingRect() const;
    virtual void paint( QPainter *painter,
                        const QStyleOptionGraphicsItem *option,
                        QWidget *widget );

    QPainterPath shape() const;

    enum { Type = 3 }; //enum {Type = BRICK_SPRITE}

    int type() const { return Type; }

private:
    QPixmap pixmap;
};

ステートメント '#define BRICK_SPRITE 3' を配置するのに適した場所はどこですか? プロジェクトには他にもいくつかのファイルがあります。すべての定義を別のヘッダー ファイルに配置する必要がありますか?

4

2 に答える 2

5

Type3の代わりに 使用しないのはなぜですか?enumC++のsは暗黙的にに変換可能ですint

代わりに本当に新しい名前が必要な場合はconst int、-の代わりに変数を使用することをお勧めします。#defineこれはタイプと名前空間に対して安全ですが、プリプロセッサマクロはそうではありません。

何かのようなもの:

class Brick : public QGraphicsItem
{
  static const int BRICK_SPRITE = 3;
  // rest of the class definition
};

私が見つけたドキュメントによると、列挙型とオーバーライドで取っているアプローチtype()は確かに好ましい方法です

于 2012-05-15T16:36:06.183 に答える
5

Qt の規則に従いたい場合は、定数にすべて大文字で名前を付けないことから始めることができます...彼らはそうしません。また、@Atilla が指摘しているように、定数にプリプロセッサ マクロを使用することは慣用的な C++ ではありません。デバッガーで値を確認できるなど、多くの正当な理由があります。

C++ - enum vs. const vs. #define

通常、定数を「所有する」ことが理にかなっているクラスを見つけることができます。Qt に配置する場所が実際にない場合、名前空間に配置するだけです。Qt::

http://doc.qt.io/archives/qt-4.7/qt.html

Brickしたがって、この値を所有する意味がない場合は、そのようなものを配置する名前空間をプログラムに含めることができます。

私は実際にそれQGraphicsItem::type()が標準的なものであることを知りませんでした...それに出くわしたことはありませんでした. ドキュメントで、カスタム ユーザー タイプは ... で開始する必要があると書かれていることに気付いたUserType + 1ので、私は間違いなくその規則に従います。を使用する予定がある場合にのみこれを行う必要があると書かれているqgraphicsitem_cast()ため、私が見た例では必要なかったのかもしれません。

定数を宣言するための規則に関して、Qt が (私が考えることができる) テーブルに持ち込む唯一の珍しいことは、Q_DECLARE_FLAGS と呼ばれるものです。

http://doc.qt.io/archives/qt-4.7/qflags.html

したがって、次のようなことをしていたとします。

class Brick : public QGraphicsItem {
public:
    static const int Type = UserType + 1;
    enum BrickFlag {
        DamagesBall = 0x1,
        ContainsCoins = 0x2,
        MultipleHits = 0x4
    };
    Q_DECLARE_FLAGS(BrickFlags, BrickFlag)
}

Q_DECLARE_OPERATORS_FOR_FLAGS(Brick::BrickFlags)

これで、と呼ばれる特別な安全な型ができました。Brick::BrickFlagsこれは (たとえば) と一緒に OR できませんBrick::Type

于 2012-05-15T17:01:14.860 に答える