繁体   English   中英

C ++中的全局类

[英]Global Classes in C++

我试图创建一个全局类,所以我可以在任何地方访问它,但它不工作,我收到错误:

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但在某种程度上有所不同,那么这些将是相互冲突的定义。 但是,编译器不需要检测不同的用途,这可能导致难以诊断问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM