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;

};
4

4 に答える 4

4

storage-classキーワードexternが問題の原因です。クラス定義にこれを指定することはできません。そして、とにかくそれは必要ありません。クラス定義にはどこからでもアクセスできます(#include定義されているファイルがあれば)。

于 2012-11-24T15:58:41.223 に答える
3

は必要ありませんextern。また、C++ではクラスをexternとして宣言することも合法ではありません。コンパイラ固有の可視性フラグと複数の共有オブジェクト(つまりGCC可視性)を台無しにせず、ネストされた、保護された、またはプライベートクラスを作成しない限り、他の場所からどのクラスにもアクセスできます。

于 2012-11-24T15:58:49.040 に答える
1

クラスの場合、「グローバル」であるという概念はあまり意味がありません。クラスは、宣言されている場所ならどこでも宣言され、それだけです。したがって、クラスを定義するときにストレージ分類は許可されません。を削除する必要がありexternます。

クラス定義を一般に利用可能にするには、クラスにアクセスする各変換ユニットにその定義を含める必要があります。これを行う方法は、それをヘッダーファイルに入れ、クラスが必要なときはいつでもファイルをインクルードすることです。

#ifndef INCLUDED_PAYMENTS
#define INCLUDED_PAYMENTS

// headers needed to define Payments

class Payments : public QObject
{
    ...
};

#endif INCLUDED_PAYMENTS

名前空間の競合を回避するには、名前空間内でクラスを宣言することを検討する必要があります。C++プログラム内のクラス定義は一意である必要があります。つまり、上記のヘッダーを含まない別のファイルもPaymentsグローバル名前空間のクラスを定義しているが、何らかの方法で異なる場合、これらは競合する定義になります。ただし、コンパイラはさまざまな用途を検出する必要はありません。そのため、問題の診断が困難になる可能性があります。

于 2012-11-24T16:04:48.767 に答える
1

C++externオブジェクトまたは関数に対してのみ使用できます。

于 2012-11-24T15:59:39.947 に答える