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

时间:2015-05-23 05:12:19

标签: c++ c

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

假设我的c ++源文件看起来

source.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上的函数时,我应该为每个实例获取不同的全局变量,还是全局变量只共享内存?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

全局变量只在内存中存在一次,并且将由整个程序共享,即每个实例/函数将访问相同的内存,并且所有人都可以看到由一个实例/函数进行的修改。

我猜你已经知道应该避免使用全局变量。但是如果你不能修改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;

答案 1 :(得分:1)

  

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

鉴于您的代码,所有类的实例只有一个全局变量。另一个类的实例与source.cpp中的全局变量无关。您可以从代码中的任意位置致电function1()function2()。这不会改变只有一个global_var1和一个global_var2的事实。