1

我在一个 linux 静态库项目中有 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;

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

如果我将 class1utils.cpp 中的方法移回 class1main.cpp,并删除 class1utils.cpp,则链接有效。

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

4

2 回答 2

4

你应该简单地包括class1.h。声明变量不需要其他任何东西。

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

extern Database *class1::pDb;此外,您甚至不能在没有定义 class1 的情况下引用 class1 的成员(如 中)。如果你尝试class class1; Database *class1::pDb;,你应该得到一个错误,你正在使用未定义的类型class1。所以 extern 声明是多余的。


另一方面,如果你有一个没有非静态成员的类,这表明你可能不应该使用一个类。C++ 不像 Java,所有东西都必须在一个类中。在 C++ 中,您可以根据需要在命名空间中简单地声明自由函数和变量。

在这种情况下,您将使用 extern 在 class1.h 中声明变量,而不是使用静态:

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

// class1main.cpp
Database *class1::pDb;
于 2012-07-10T19:51:53.737 回答
0

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

您似乎试图通过extern Database * class1::pDb在另一个实现文件中重新声明该成员。这简直是​​无效的。声明类成员的唯一方法是提供完整的类定义。

于 2012-07-10T20:13:24.920 回答