gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:03:46 32 4
gpt4 key购买 nike

我在 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,则链接有效。

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

最佳答案

您应该只包含 class1.h。声明变量不需要其他任何东西。

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

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


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

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

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

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

关于类的第二个实现文件中静态字段的 C++ 外部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420770/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com