C++中的全球课程
Global Classes in C++
本文关键字:C++ 更新时间:2023-10-16
我试图创建一个全局类,以便我可以在任何地方访问它,但它不起作用,我收到错误:
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;
};
存储类关键字extern
导致问题。不能为类定义指定此项。而且你不需要它:你的类定义可以从任何地方访问(前提是你#include
它定义的文件)。
你不需要extern
,在C++中甚至将类声明为 extern 是不合法的。任何类都可以从其他任何地方访问,只要您不弄乱编译器特定的可见性标志和多个共享对象(即 GCC 可见性),并且不创建嵌套、受保护或私有类。
C++
只允许对对象或函数使用extern
。
对于类来说,"全局"的概念并没有多大意义:无论在哪里声明类,类都会被声明,仅此而已。因此,定义类时不允许存储分类:您需要删除extern
。
要使类定义正式可用,您需要将其定义包含在要访问类的每个翻译单元中。执行此操作的方法是将其放入头文件中,并在需要类时包含该文件:
#ifndef INCLUDED_PAYMENTS
#define INCLUDED_PAYMENTS
// headers needed to define Payments
class Payments : public QObject
{
...
};
#endif INCLUDED_PAYMENTS
为了避免命名冲突,您应该考虑在命名空间中声明您的类:C++程序中的类定义必须是唯一的。也就是说,如果另一个不包含上述标头的文件也在全局命名空间中定义了类Payments
,但在某些方面有所不同,则这些定义将是冲突的。但是,编译器不需要检测不同的用途,这可能会导致难以诊断的问题。
相关文章:
- 没有找到相关文章