如何在 C++ 中跨多个源文件共享变量?

Posted

技术标签:

【中文标题】如何在 C++ 中跨多个源文件共享变量?【英文标题】:How to share a variable across multiple source files in C++? 【发布时间】:2020-03-20 15:01:34 【问题描述】:

我的目标总结

我想在 C++ 中的多个 .cpp 文件之间创建一个已声明类的全局实例

说明

如果你想走得快,你可以在预期之后跳。

我知道很多人说我不应该使用全局变量,原因太多...阅读我的解释以了解我为什么需要它们。

第 1 步: 我正在编写一个 C++ 程序,该程序在头文件中定义了一个类。(该类的函数在 cpp 文件中声明。)

为了解释它,我将使用过度简化的假设代码。 (不是实际的。)

简化假设Class.h的代码:

class Class 
    public:
        Class(intx,int y); //Does a lot of things

        int OP1(int x); //Dummy operation
        int OP2(int x); //Dummy operation
    private:
        type ManyVars;

简化假设main.cpp的代码

#include "Class.h"

Class Member(140,360);  //Declares it with parameters

bool Func1(int x)  //Dummy function
    int y = Member.OP2(x);
    return x > Member.OP1(y);


bool Func2(int x)  //Dummy function
    int y = Member.OP2(x) * x;
    return x > Member.OP1(y) +1;



int main() 
    int x;

    std::cin >> x;

    y = Func2(x);
    z = Func1(y * x / 5);

    return Func2(z) + x / y;

就我而言,一切正常,但 main.cpp 中的代码非常大,因为我有超过 16 个函数,包括 2 个大函数!(我展示在我的示例中只有两个函数很简单。)

第 2 步:为了使代码更易于阅读,我将小函数移到另外两个文件 Funcs.cppFuncs.h 中, 就像一个图书馆。 然后,我将大函数移动到一个新的 .cpp 文件中,每个函数都包含在另一个头文件中。(在示例中隐藏,因为它类似于 Funcs.cpp。)

所以,现在假设的main.cpp 看起来像这样:

#include "Class.h"
#include "Funcs.h"

Class Member(140,360);

int main() 
    int x;

    std::cin >> x;

    int y = Func2(x);
    int z = Func1(y * x / 5);

    return Func2(z) + x / y;

假设的Funcs.cpp 看起来像这样:

#include "Class.h"
#include "Funcs.h"

bool Func1(int x) 
    int y = Member.OP2(x);
    return x > Member.OP1(y);


bool Func2(int x) 
    int y = Member.OP2(x) * x;
    return x > Member.OP1(y) +1;

现在出现一个问题:Member定义在 main.cpp 但我也需要它 Funcs.cpp (以及其他函数文件也).

第 3 步: 我尝试为每个函数添加另一个Class 类型的输入值,并在使用时将Member 放入其中。它有效,但功能看起来很糟糕我不希望每个函数都有额外的参数!所以我暂时将代码恢复到第 1 步。

期望

我想要的是在它们之间共享同一个实例的任何方式。 它基本上是一个全局变量。 我想保留相同的功能。 int y = Member.OP2(x) 不能更改 每个文件的开头都可以更改。 我希望能够声明多个这样的Members(我不会,但一定可以这样做)。

有人知道以这种方式共享实例的方法吗?

如果有不清楚的地方请告诉我。

【问题讨论】:

但是Member 不是成员,它是一个全局变量。您可以使用与任何全局变量相同的方法在不同的源文件之间共享它。 【参考方案1】:

Member 是一个全局变量。使用用于任何全局变量的常用技术共享它,在头文件中声明它并在源文件中定义它(一次)。

在头文件中(比如 Class.h)

extern Class Member;

在 main.cpp 中

Class Member(140,360);

就是这样。

【讨论】:

【参考方案2】:

使用全局变量的另一种方法是利用单例模式,将类的唯一实例存储在静态存储中(Construct On First Use Idiom)。

有一个 question 解释了这个和约翰的答案之间的区别(参见 C++ FAQ 解决了什么是 initialisation order fiasco 和 how does this approach avoid it)。

template<int x, int y>
class Class

public:
    static Class & get_instance()
    
        static Class instance; // <- called only once!
        return instance;
    

    Class(const Class &) = delete;

    Class & operator=(const Class &) = delete;

    bool OP1(int a)
    
        return a > x;
    

    bool OP2(int b)
    
        return b > y;
    

private:
    Class() = default;

    ~Class() = default;
;

然后,您可以通过get_instance()方法获取对实例的引用

auto& Member = Class<140,360>::get_instance();

【讨论】:

以上是关于如何在 C++ 中跨多个源文件共享变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中跨线程共享全局变量?

在 JOGL 中跨多个 QWidget 共享 VBO

在 Grails 中跨多个插件共享身份验证

C# - 在共享命名空间中跨文件使用命名空间

我可以在 React 中跨多个树共享一个组件实例吗?

在vertx中跨顶点共享单例客户端的正确方法