gpt4 book ai didi

c++ - 类的全局实例(跨多个文件)

转载 作者:行者123 更新时间:2023-11-28 02:14:10 25 4
gpt4 key购买 nike

我正在 C::B 中处理一个项目,需要在多个项目文件中使用类的全局实例。 (我不熟悉头文件和全局类的使用)
我已经这样声明、定义、初始化类和函数:

//在complex.h中

class Julia
{
public:
double R;
double I;
void algorithm();
};
Julia J;

//在complex.cpp中

#include "complex.h"
void Julia::algorithm()
{
//fn body here
}

//在main.cpp中

#include"complex.h"
int main()
{
//calls initialize() and display()
}

void initialize()
{
//...some code(irrelevant)
cin>>J.R>>J.I;
}

void display()
{
J.algorithm();
//some more (irrelevant) code
}

在构建和运行代码时,我收到错误 - “first defined here”并且构建日志显示:

obj\Debug\complex.o:complex.cpp:(.bss+0x3bf0): ‘J’的多重定义obj\Debug\main.o:C:/Users/ShA/Documents/etf_build/main.cpp:20: 首先在这里定义

[这是我 12 年级的学校项目,我认为我不会被允许使用单例(限制),即使它们看起来很合适。 ]

有人可以指出代码中可能存在的错误以及如何找到解决我遇到的错误的方法吗?

最佳答案

声明

Julia J;

在您的 header 中是 J定义,通过包含 header ,您可以在两个翻译单元中拥有此定义:main.cpp 翻译单元和 complex.cpp 翻译单元。

链接器不知道它们是(本来是)相同的定义。

在链接器看来,它是同一事物的两个独立且相互冲突的定义。


一个纯粹的技术解决方案是让J成为一个单例,一个简单的方法是通过一个static变量函数,称为“Meyers 单例”:

inline
auto J()
-> Julia&
{
static Julia the_object;
return the_object;
}

上面的技术解决方案是不好的,因为像直接全局变量一样,单例引入了复杂的任意通信线路,例如通过您的 init 函数。

还有一个更不好的技术方案,就是在header中声明变量为extern,然后在对应的实现文件中定义。这是非常不好的,因为在更一般的情况下,它冒着使用未初始化变量的风险。这称为“静态初始化顺序失败”,在 C++ FAQ 中进行了讨论。

您应该更改设计并让 main 创建 Julia 实例,而不是这些技术变通办法。

它可以传递给调用的函数。

如果你发现它被传递给了一些函数,特别是作为第一个参数,那么也许这些函数应该是 Julia 类的成员函数,或者你应该引入一个新的为此上课。

关于c++ - 类的全局实例(跨多个文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554000/

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