2012-05-15 2 views
4

을 가야한다. 내 공 QGraphicsItem의 어떤 유형이 충돌했는지 알아야합니다. 예를 들어 공이 벽과 충돌하면 공이 튀어 오릅니다. 벽돌과 충돌하면 공이 튀어 나와 벽돌이 파괴됩니다. 어떤 종류의 QGraphicsItem인지 알아 내기 위해 최선의 방법은 QGraphicsItem::type()을 무시하는 것입니다 (올바른 방법이 아닌지 알려주세요.). brick.h 다음 코드에서 C++/Qt는 코딩 스타일 - 어디에 정의 # 나는 <code>Qt</code>에 브레이크 아웃 게임 클론을 구축을 위해 노력하고

나는 이제, 값 3 추적 정말 성가신 보이는 3의 유형을 가지고 내 '벽돌'을 설정합니다. 나는 대신 '#DEFINE' '#DEFINE의 BRICK_SPRITE 3'문을 배치 할 수있는 좋은 위치입니다

#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; 
}; 

뭔가를 선언하는 것을 선호? 프로젝트에 여러 파일이 있습니다. 모든 정의를 별도의 헤더 파일에 넣어야합니까?

답변

5

왜 그냥 Type 대신 3 사용할 수 있습니까? 당신이 정말로 대신 새 이름을 원 경우 int

에 암시 적으로 변환됩니다 C++로 enum들, 당신이 대신 #defineconst int 변수를 사용하는 것이 좋습니다 - 그것은 종류와 네임 스페이스 안전, 전처리 매크로가없는 동안 .

뭔가 같은 :

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

내가 찾을 수있는 문서화에 따르면, 방법은 당신이 열거와 함께 복용하고 최우선 type() 실제로 선호하는 방법

+0

enum 해킹은 더 이상 괜찮은 컴파일러에 필요하지 않습니다. 인라인 정적 const int가 가장 좋습니다. – DanDan

+0

@Atilla - 내가 왜 당신의 진술을 이해하는지 모르겠다. 왜 3 대신 Type을 사용하지 않을까? enum {Type}을 사용하면; , Type은 자동으로 0이됩니다. 이것이 당신이 의미 한 것입니까? Type의 값을 3으로하고 싶습니다. 특별한 이유가 없습니다. 나는 내 이유가 그것이 독특하기를 원한다고 생각한다. – Mathai

+0

아니요, 지금처럼 열거 형을 유지하고'BRICK_SPRITE'를 사용하고자 할 때'Type'을 사용했습니다 - 이름'Type'이 표현력이 충분하지 않으면'BRICK_TYPE '으로 변경할 수 있습니다 '열거 형, 또는 내 대답 – Attila

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에서 시작해야한다고 말하는 in the documentation을 발견했습니다 ... 그래서 나는 분명히 그 규칙을 따를 것입니다. 그것은 당신이 qgraphicsitem_cast()을 사용하려고 계획한다면 이것을 수행 할 필요가 있다고 말합니다. 그래서 내가 보았던 예제는 단지 그것을 필요로하지 않았습니다.

Qt는 상수를 선언하는 규칙의 관점에서 (내가 생각할 수있는) 테이블에 가져 오는 유일한 이상한 점은 경우에 형식 안전성을 제공합니다 Q_DECLARE_FLAGS이라는 것을, 어디 OR 함께 플래그 :

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) 

, 당신은 (예를 들어)와 함께 OR 될 수 Brick::BrickFlags라는 특별한 안전 유형,.

+1

당신의 충고와 Attila의 선언에 따라 선언을 static const int로 변경하려고합니다. 그건 그렇고 Qt documententation enum {Type = UserType + 1}의 줄을 보았습니다. QGraphicsItem의 UserType은 65536입니다. 값 3을 할당하는 대신이 작업을 수행해야하는지 궁금합니다 (내 응용 프로그램에서 고유 할 것입니다). 벽돌에 UserType + 1을 사용하면 정적 선이 있어야합니다. int int BrickSprite = UserType + 1; – Mathai

+0

아. 나는 타입()이 표준적인 것인지 몰랐다. 이를 반영하기 위해 내 대답이 업데이트되었습니다. – HostileFork