C ++中的全局类

时间:2012-11-24 15:56:04

标签: c++

我正在尝试创建一个全局类,以便我可以在任何地方访问它,但它不起作用,我收到错误:

a storage class can only be specified for objects and functions

有谁知道我哪里出错了?

这是我的文件:

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 个答案:

答案 0 :(得分:4)

存储类关键字extern会导致问题。您不能为类定义指定它。而且你无论如何都不需要它:你的类定义可以从任何地方访问(只要你#include定义了它的文件)。

答案 1 :(得分:3)

您不需要extern,在C ++中将类声明为extern甚至都不合法。只要您不熟悉特定于编译器的可见性标志和多个共享对象(即GCC visibility)并且不创建嵌套,受保护或私有类,任何类都可以从其他任何位置访问。

答案 2 :(得分:1)

C++允许仅将extern用于对象或函数。

答案 3 :(得分:1)

对于课程来说,存在的概念是"全球"并没有多大意义:类在声明它们的任何地方都被声明。因此,在定义类时不允许存储分类:您需要删除extern

要使类定义普遍可用,您需要在要访问类的每个翻译单元中包含其定义。执行此操作的方法是将其放入头文件中,并在需要该类时包含该文件:

#ifndef INCLUDED_PAYMENTS
#define INCLUDED_PAYMENTS

// headers needed to define Payments

class Payments : public QObject
{
    ...
};

#endif INCLUDED_PAYMENTS

为避免命名冲突,您应该考虑在命名空间内声明您的类:C ++程序中的类定义必须是唯一的。也就是说,如果不包括上述标题的另一个文件在全局命名空间中定义了类Payments但在某种程度上有所不同,那么这些定义将是冲突的。但是,编译器不需要检测不同的用途,这可能导致难以诊断问题。