2010-01-08 41 views
13

Tôi có một biến mà tôi muốn sử dụng trong tất cả các lớp của mình mà không cần phải chuyển nó đến lớp khởi tạo mỗi khi tôi muốn sử dụng nó. Làm thế nào tôi sẽ thực hiện điều này trong C + +?Làm thế nào để khai báo một biến toàn cầu có thể được sử dụng trong toàn bộ chương trình

Cảm ơn.

+0

Cho dù bạn có sử dụng 'Singleton' hay không, một trong những vấn đề vẫn là bạn có khả năng' khởi tạo/hủy đơn hàng chờ đợi ... ngay cả trong một chương trình được tạo luồng đơn. Điều đó nói rằng, tôi biết rằng đôi khi nó chỉ là dễ dàng hơn rất nhiều, đặc biệt là khi bạn muốn thúc đẩy tách. –

Trả lời

19
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 sẽ được biết và có thể sử dụng trong mọi mô-đun dưới dạng biến toàn cầu. Bạn không cần phải có global.cpp. Bạn có thể khởi tạo myVar trong bất kỳ lớp học nào .cpp's nhưng tôi nghĩ rằng điều này là sạch hơn cho các chương trình lớn hơn.

2

Chỉ cần khai báo nó bên ngoài lớp:

header file:

extern int x; 

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

Một tập tin nguồn:

int x = 0; 
+0

nơi tôi nên đặt nó nếu tôi sử dụng một tiêu đề khác nhau cho mỗi lớp và tôi muốn sử dụng nó trong tất cả các lớp học? – trrrrrrm

+0

bạn phải xác định nó trong một tệp .cpp. Các "tiêu đề" (không quan trọng nếu chúng ở trong .cpp của họ thay vì) phải chứa từ khóa 'extern' cho tên biến đó –

+0

Hầu hết các trình biên dịch hỗ trợ __declspec (selectany) int x = 0; trong tiêu đề. –

0

Khai báo các biến như extern trong một tiêu đề chung.

Xác định nó trong bất kỳ tệp nguồn nào.

1

từ khóa 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 
0

nếu bạn muốn khai báo nó trong khác nhau file header/file cpp, chỉ cần khai báo nó extern bên ngoài của các file khác

//file1.c 
int x=1; 
int f(){} 
//file2.c 
extern int x; 
0
// L.hpp 
struct L { static int a; }; 

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

Trong khi tôi muốn tránh các biến toàn cầu như bệnh dịch hạch vì phần mềm của chúng tôi không thể đa luồng hiệu quả do sự phụ thuộc cao vào các biến toàn cầu, tôi có một số gợi ý:

Sử dụng Singleton. Nó sẽ cho phép bạn giữ mã và truy cập sạch sẽ. Một phần của vấn đề với một biến toàn cục là bạn không biết mã nào đã sửa đổi nó. Bạn có thể đặt giá trị toàn cục ở đâu đó trong hàm của bạn dựa vào hy vọng rằng không ai khác thay đổi nó, nhưng chức năng các lệnh mã của bạn, fooA, thay đổi nó và bây giờ mã của bạn là a) bị hỏng và b) khó gỡ lỗi.

Nếu bạn phải sử dụng biến toàn cầu mà không cần chạm vào mẫu đơn, hãy xem phản hồi của fupsduck.

4

Nếu bạn không sử dụng mẫu Singleton như Lyndsey gợi ý, thì ít nhất hãy sử dụng hàm toàn cầu (bên trong một vùng tên) để truy cập biến. Điều này sẽ giúp bạn linh hoạt hơn trong cách bạn quản lý thực thể toàn cầu đó.

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

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

    int getGlobalVariable() 
    { 
     return myGlobalVariable; 
    } 
} 
+0

Tôi khuyên bạn nên tạo hàm setGlobalVariable (int newValue) để ít nhất việc ghi nhật ký có thể được thêm vào để theo dõi các thay đổi ... –

Các vấn đề liên quan