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

C++允许使用externonly 对象或函数。

于 2012-11-24T15:59:39.947 回答
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 回答