C ++跨文件共享变量的良好实践?

时间:2016-07-12 15:12:19

标签: c++ scope namespaces include

我试图想出一种在多个文件之间共享数据的好方法,但我确定某些方法比其他方法更好,所以我来这里问最安全的方法以这种方式共享数据的方法。在下面的例子中,我将展示我到目前为止一直在做什么,但我觉得这不是最好的方法。

让我们举个例子,我有5个文件:file1.h,file1.cpp,file2.h file2.cpp和main.cpp。他们可能看起来像这样:

//main.cpp
#include "file1.h"
#include "file2.h"

int main(){
    PushOne pushOne;
    PushTwo pushTwo;

    pushOne.Push();
    pushTwo.Push();

    for (int i =0; i<q.size(); i++){
        std::cout << q.front() << std::endl;
        q.pop();
    }
    return 0;
}

//file1.h
namespace Foo{

    extern std::queue<int> q; //resource to be shared across files

    class PushOne{
    public:
        void Push();
    };

}

//file1.cpp
#include "file1.h"
namespace Foo{

    std::queue<int> q;

    void PushOne::Push(){
        q.push(1);
    }
}

//file2.h
#include "file1.h" //#include this to have access to namespace variables declared in this file...Seems sort of inefficient
namespace Foo{

    class PushTwo{
    public:
        void Push();
    };
}

//file2.cpp
#include "file2.h"

namespace Foo{
    void PushTwo::Push(){
        q.push(2);
    }
}

所以在这里,我有一个名称空间变量std :: queue q,我想在file1和file2中访问它。我似乎不得不将这个命名空间变量放入两个文件中的一个并且#include另一个文件,这似乎没有意义。有没有更好的方法呢?这似乎给予了一些不对称的&#34;访问std::queue<int> q。我甚至不知道这是否一定是消极的,但也许有人可以对这种方法的效率有所了解或提出另一种方法。

1 个答案:

答案 0 :(得分:2)

如果您确实想这样做,请在头文件中定义一个带静态元素的结构:

MyQueue.h:

struct MyQueue {
   static std::queue<int> q;
}

您还必须在相应的.cpp文件中定义变量。

MyQueue.cpp:

#inclue "MyQueue.h"

static std::queue<int> MyQueue::q;

您可以通过包含该标题的任何文件访问它,例如:

MyQueue::q.push(2);

这仍然是我不推荐的,特别是如果有多个线程,因为它是一个全局变量。

另一种选择是使用单身,但这也有同样的问题。