我正在尝试创建一个全局类,以便我可以在任何地方访问它,但它不起作用,我收到错误:
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;
};
答案 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
但在某种程度上有所不同,那么这些定义将是冲突的。但是,编译器不需要检测不同的用途,这可能导致难以诊断问题。