如何声明可以在整个程序中使用的全局变量

时间:2010-01-08 17:14:33

标签: c++

我有一个变量,我想在我的所有类中使用,而不需要每次我想使用它时都将它传递给类构造函数。我将如何在C ++中实现这一目标?

感谢。

9 个答案:

答案 0 :(得分:25)

global.h
extern int myVar;

global.cpp
#include "global.h"
int myVar = 0;  // initialize

class1.cpp
#include "global.h"
...

class2.cpp
#include "global.h"
...

class3.cpp
#include "global.h"
...

MyVar将作为全局变量在每个模块中被知道并可用。您不必拥有global.cpp。您可以在任何类.cpp中初始化myVar,但我认为这对于较大的程序来说更清晰。

答案 1 :(得分:4)

如果您不打算像Lyndsey建议的那样使用Singleton模式,那么至少使用全局函数(在命名空间内)来访问变量。这将为您提供更灵活的管理全局实体的方式。

// mymodule.h
namespace mynamespace // prevents polluting the global namespace
{
   extern int getGlobalVariable();
}

// mymodule.cpp
namespace mynamespace
{
   int myGlobalVariable = 42;

   int getGlobalVariable()
   {
      return myGlobalVariable;
   }
}

答案 2 :(得分:3)

只需在课堂外声明:

标题文件:

extern int x;

class A {
  int z;
  public:
  A() : z(x++) {}
};

一个源文件:

int x = 0;

答案 3 :(得分:3)

虽然我想避免像瘟疫这样的全局变量,因为我们的软件由于对全局变量的高度依赖而无法有效地进行多线程处理,但我确实有一些建议:

使用Singleton。它将允许您保持代码和访问清洁。全局变量的部分问题是你不知道代码修改了它。你可以在你的函数中的某个地方设置global的值,希望没有其他人会改变它,但是你的代码调用函数fooA,更改它,现在你的代码是a)坏了,b)很难调试。 / p>

如果必须使用全局变量而不触及单例模式,请查看fupsduck的响应。

答案 4 :(得分:2)

关键字extern

//file1.cpp

int x = 0;

//file1 continues and ends.


//file2.cpp

extern int x; //this gets tied into file1.cpp's x at link time.

//file2.cpp goes on and ends

答案 5 :(得分:0)

在公共标题中将变量声明为extern

在任何源文件中定义它。

答案 6 :(得分:0)

如果你想在不同的头文件/ cpp文件中声明它,只需在其他文件之外声明extern

//file1.c
int x=1;
int f(){}
//file2.c
extern int x;

答案 7 :(得分:0)

// L.hpp
struct L { static int a; };

// L.cpp
int L::a(0);

答案 8 :(得分:0)

根据标题“如何声明可在整个程序中使用的全局变量”,以下解决方案应足够简单 “。 如果要在其他文件中使用它,请使用extern关键字。

请让我知道解决方案是否有问题

#include<iostream>

using namespace std;

int global = 5;

class base {
    public:
        int a;
        float b;
        base (int x) {
            a = global;
            cout << "base class value =" << a << endl;
        }
};

class derived : public base {
    public:
        int c;
        float d;
        derived (float x, int y) : base (y)
        {
            d = global;
            cout << "derived class value =" << d << endl;
        }
};


int main ()
{
    derived d(0,0);
    cout << "main finished" << endl;
    return 0;
}