2012-11-24 5 views
2

임 난 아무데도 액세스 할 수 있도록 글로벌 클래스를 만들려고하지만, 작동하지 않는, 나는 오류가? 문제를 일으키는 extern글로벌 수업 ++

extern class Payments : public QObject 
{ 
Q_OBJECT 
public: 
    Payments(QObject *parent = 0); 
    virtual ~Payments(); 
    void purchase(const QString &id, const QString &sku, const QString &name, const QString &metadata); 
    void getExisting(bool refresh); 
    void getPrice(const QString &id, const QString &sku); 

public slots: 
    void purchaseResponse(); 
    void existingPurchasesResponse(); 
    void priceResponse(); 

signals: 
    void purchaseResponseSuccess(const QString &receiptString); 
    void existingPurchasesResponseSuccess(const QString &receiptsString); 
    void priceResponseSuccess(const QString &price); 
    void infoResponseError(int errorCode, const QString &errorText); 


private: 
    bb::platform::PaymentManager *paymentManager; 

}; 
+1

'공개 슬롯 :'과'signals :'이란 무엇입니까? 전에 구문을 본 적이 없다 ... – 0x499602D2

+1

옵서버 패턴을 구현하는 Qt 구문. – Morwenn

+0

@David : QT에 고유하며 사전 컴파일러로 변형되었습니다. –

답변

4

저장-class 키워드 :

여기에 내 시간의 파일입니다. 클래스 정의에는이를 지정할 수 없습니다. 그리고 어쨌든 필요하지 않습니다. 클래스 정의는 어디서나 액세스 할 수 있습니다 (#include이 정의 된 파일을 제공).

+0

감사합니다. Payments * 지급을 사용하여 위 클래스를 초기화합니다. 헤더 파일에서 payments = new Payments; 메인 클래스. 프로그램에있는 다른 클래스의 급여에 어떻게 즉시 액트 할 수 있습니까? – panthro

+0

@ user1013512 : 포인터를 전달하거나 싱글 톤으로 지정해야합니다. 그리고 책을 읽으면 도움이 될 것입니다. :) –

+0

@ user1013512 클래스의 글로벌 _instance_ (전역 객체)를 선언하는 방법은 다음 기존 질문을 참조하십시오. http://stackoverflow.com/questions/4918010/c-global-object, http : // stackoverflow .com/questions/635658/what-is-the-the-best-way-to-global-variable. 또한 전역 개체가 필요한지 여부도 고려하십시오. http://stackoverflow.com/questions/484635/are-global-variables-bad – jogojapan

3

extern이 필요하지 않으며 클래스를 extern으로 선언하는 것은 C++에서도 적합하지 않습니다. 컴파일러 관련 가시성 플래그 및 여러 공유 객체 (예 : GCC visibility)를 혼동하지 않고 중첩, 보호 또는 개인 클래스를 만들지 않는 한 모든 클래스는 다른 곳에서 액세스 할 수 있습니다.

1

C++은 개체 또는 기능에만 extern을 사용할 수 있습니다.

1

클래스의 경우 "글로벌"이라는 개념은 실제로 의미가 없습니다. 클래스는 선언 된 위치와 선언 된 위치 모두에서 선언됩니다. 따라서 클래스를 정의 할 때 저장 분류가 허용되지 않습니다. extern을 제거해야합니다.

일반적으로 클래스 정의를 사용하려면 클래스에 액세스하려는 각 번역 단위에 해당 정의를 포함해야합니다. 이 작업을 수행하는 방법은 클래스를 필요할 때마다 헤더 파일에 넣고 파일을 포함하는 것입니다 :

#ifndef INCLUDED_PAYMENTS 
#define INCLUDED_PAYMENTS 

// headers needed to define Payments 

class Payments : public QObject 
{ 
    ... 
}; 

#endif INCLUDED_PAYMENTS 

네임 스페이스 내에서 클래스를 선언 고려해야 충돌 이름 않도록하려면 다음을 C에서 클래스 정의를 ++ 프로그램은 고유해야합니다. 즉, 위의 헤더를 포함하지 않는 다른 파일이 전역 네임 스페이스의 클래스 Payments을 정의하지만 어떤 방식 으로든 다른 경우 이러한 정의는 상충됩니다. 그러나 컴파일러는 다른 용도를 감지 할 필요가 없으므로 문제를 진단하기가 어려울 수 있습니다.