gpt4 book ai didi

c++ - 使用来自另一个 C++ 类的全局变量创建 C++ 源文件的多个实例

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:21 25 4
gpt4 key购买 nike

我想知道是否可以使用来自另一个 C++ 类的全局变量创建多个 C++ 源文件实例,

假设我的 C++ 源文件看起来像

源代码.cpp

int global_var1;
int global_var2;

extern "c" int function1(){
// do some thing with global_var1
}
extern "c" int function2(){
// do some thing with global_var2
}

现在,如果我从具有多个实例的 C++ 类中调用它,它应该是正确的方法吗?

克服这种情况的更好方法是什么,我无法将 source.cpp 修改为另一个 calss。

编辑:我想知道的是,当我从不同的类调用 source.cpp 上的函数时,我应该为每个实例获取不同的全局变量,还是全局变量只共享内存?。

我们将不胜感激。

最佳答案

一个全局变量在内存中只存在一次,并且将被整个程序共享,即每个实例/函数将访问相同的内存,并且一个实例/函数所做的修改将对所有人可见。

我想您已经知道应该避免使用全局变量。但是如果你不能修改 source.cpp(并且必须按原样使用它),情况是:

在单线程的情况下,你不会有问题。

在多线程的情况下,您可以在调用两个函数时在类中使用 std::mutex 来保护对 function1 和 function2 的访问。通过这种方式,您可以确保当时只有您的类的一个实例访问全局变量。

类似于:

class A {

static std::mutex myLock;

void someFunc()
{
myLock.lock();
int x = function1();
myLock.unlock();
}
}

std::mutex A::myLock;

如果你不想要真正的全局变量,而是想模拟你的类的每个实例都有它“自己的”全局变量,你可以尝试这样的事情:

class A {

int mglobal_var1;
int mglobal_var2;

static std::mutex myLock;

void someFunc()
{
myLock.lock();
global_var1 = mglobal_var1; // Set the real global to "local" value
int x = function1();
mglobal_var1 = global_var1; // Save the real global for later use
myLock.unlock();
}
}

std::mutex A::myLock;

关于c++ - 使用来自另一个 C++ 类的全局变量创建 C++ 源文件的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409126/

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