2012-11-24 53 views
2

我試着去建立一個全球性的類,所以我可以在任何地方訪問它,但它不工作,我得到的錯誤:全局類++

a storage class can only be specified for objects and functions 

有誰知道我要去哪裏錯了嗎?

這裏是我的.h文件:

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

'public slots:'和'signals:'是什麼?從未看過之前的語法... – 0x499602D2

+1

Qt語法來實現觀察者模式。 – Morwenn

+0

@David:它特定於QT並通過預編譯器進行轉換。 –

回答

4

存儲類關鍵字extern導致該問題。你不能爲類定義指定它。而且你不需要它:你的班級定義可以從任何地方訪問(只要你在其中定義了#include文件)。

+0

謝謝,我使用Payments *付款初始化上述課程;在頭文件中,然後付款=新付款;在主類中。我如何在程序中的其他地方訪問其他課程的付款時間? – panthro

+0

@ user1013512:您可能需要傳遞該指針或使其成爲單例。感覺就像讀書一樣,你會受益! :) – 2012-11-24 16:20:05

+0

@ user1013512有關如何聲明一個類的全局_instance_(即全局對象),請參閱這些現有問題:http://stackoverflow.com/questions/4918010/c-global-object,http:// stackoverflow .COM /問題/ 635658 /什麼,是最最好的辦法對申報-一個全局變量。還要考慮你是否真的需要一個全局對象:http://stackoverflow.com/questions/484635/are-global-variables-bad – jogojapan

3

你不需要extern,在C++中聲明類爲extern並不合法。只要您不要混淆編譯器特定的可見性標誌和多個共享對象(即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,但在某些方面有所不同,這些將是衝突的定義。編譯器不需要檢測不同的用途,但是,這可能導致難以診斷問題。