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,但在某些方面有所不同,则这些定义将是冲突的。但是,编译器不需要检测不同的用途,这可能会导致难以诊断的问题。

相关文章:
  • 没有找到相关文章