类的第二个实现文件中的静态字段的C ++ extern?

时间:2012-07-10 19:46:16

标签: c++ static extern

我在linux静态lib项目中有3个文件,我有一个静态字段的链接问题,我想在两个类方法实现文件中使用。我有class1.h,class1main.cpp和class1utils.cpp。 class1.h定义了一个名为class1的类,它包含所有静态方法和一个名为pDb的静态字段。 .cpp文件定义了分为两个文件的class1方法的实现。

在class1.h中,我声明了静态:

class class1    {
public:
    static Database * pDb;
    ...
}

在class1main.cpp中,我在顶部定义了实际的静态:

Database * class1::pDb;

所以,我想我可以在class1utils.cpp中执行以下操作:

extern Database * class1::pDb;

但是当我创建项目并引入lib时,pDb在链接时被多次定义。有人能告诉我如何在第二个源文件中引用静态,以便我可以使用它(它会链接)吗?

如果我将class1utils.cpp中的方法移回class1main.cpp,并删除class1utils.cpp,则链接可以正常工作。

感谢您的任何建议。 科里。

2 个答案:

答案 0 :(得分:4)

你应该只包括class1.h。声明变量不需要任何其他内容。

这样做的一个原因是,如果您可以在不存在类定义的情况下声明静态成员变量,那么将隐藏静态成员的访问说明符。编译器无法检查访问权限。

此外,如果没有定义class1,你甚至不能引用class1的成员(如在extern Database *class1::pDb;中)。如果您尝试class class1; Database *class1::pDb;,则会收到错误消息,表明您使用的是未定义类型class1。因此,外部声明是多余的。


另一方面,如果你有一个没有非静态成员的类,那么你可能不应该使用类。 C ++与Java不同,它必须在一个类中。在C ++中,如果需要,可以在命名空间中简单地声明自由函数和变量。

在这种情况下,那么你将使用extern在class1.h中声明变量而不是使用static:

// class1.h
namespace class1 {
    extern Database *pDb;
}

// class1main.cpp
Database *class1::pDb;

答案 1 :(得分:0)

您的class1.h标头已包含成员class1::pDb的声明。您将能够在包含class1.h的任何实现文件中访问该成员。不需要额外的步骤。

您似乎尝试通过在另一个实现文件中执行extern Database * class1::pDb来重新声明此成员。这根本无效。声明类成员的唯一方法是提供完整的类定义。