2010-05-09 36 views
6

Tôi có một lớp học nên được khai báo trên toàn cầu từ main() và được truy cập từ các lớp được khai báo khác trong chương trình, làm cách nào để làm điều đó?C++: Khai báo một lớp toàn cầu và truy cập nó từ các lớp khác?

class A{ 
    int i; 
    int value(){ return i;} 
}; 

class B{ 
    global A a; //or extern?? 
    int calc(){ 
     return a.value()+10; 
    } 
} 

main(){ 
    global A a; 
    B b; 
    cout<<b.calc(); 
} 
+0

Tôi đoán mẫu thiết kế singelton là một điểm tốt để bắt đầu với http://stackoverflow.com/questions/1008019/c-singleton-design-pattern –

+3

@Artem: [Singletons: Giải quyết các vấn đề bạn không biết bạn không bao giờ đã có từ năm 1995] (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/) –

+0

@Artem - để reemphasize những gì @ gf nói - đừng làm thế! Trạng thái toàn cầu làm cho mã không thể soạn và kết hợp chặt chẽ. Điều này là xấu, trong số các lý do khác, bởi vì nó làm cho nó hầu như không thể kiểm tra. Ngoài ra, gần như mọi thực hiện singleton tôi đã thấy không phải là chủ đề an toàn trong một số cách tinh tế và khó chịu bạn không nhận thấy cho đến khi mã của bạn chạy trên một CPU với một mô hình bộ nhớ yếu. – Stewart

Trả lời

7

Có thể bạn thực sự không muốn làm điều này, nhưng nếu bạn phải - trong file có chứa chính:

#include "A.h" 
A a; 

int main() { 
... 
} 

và sau đó trong các tập tin mà cần phải truy cập toàn cầu:

#include "A.h" 
extern A a; 

Bạn sẽ cần phải đặt tuyên bố A trong tệp tiêu đề Ah để làm việc này.

+0

Cảm ơn, các phần tử bên ngoài có thể nhìn thấy được từ bên trong các lớp khác không? – Regof

+1

@Regof Nếu một cái gì đó được khai báo ở phạm vi tệp (để sử dụng một thuật ngữ cũ) và không được gắn thẻ là tĩnh, nó có thể được truy cập từ _anywhere_. Đó là lý do tại sao tạo các đối tượng như vậy là A Bad Idea. Tôi sẽ không bao giờ tạo ra những thứ như vậy trong mã của riêng tôi, và tôi đề nghị bạn không nên. Nhưng ngôn ngữ, như tôi đã chỉ ra, cho phép nó. –

+0

hãy để tôi dùng thử ... thats chỉ cho một thử nghiệm, chỉ cần chơi xung quanh, đừng lo lắng :-) – Regof

1

Trong C++ khai báo một thể hiện chung của một lớp là không có.

Thay vào đó, bạn nên sử dụng mẫu đơn, cung cấp cho bạn một cá thể đối tượng duy nhất có thể truy cập được từ toàn bộ ứng dụng.

Bạn có thể tìm thấy nhiều tài liệu về triển khai singleton C++, nhưng wikipedia là một nơi tốt để bắt đầu.

Thread safe singleton pattern implementation đã được thảo luận về luồng ngăn xếp.

+3

Không thể sử dụng toàn cầu, vì vậy hãy sử dụng singleton? Bạn nghĩ gì về singleton? Đó là toàn cầu. Chỉ cần sử dụng một toàn cầu và mương tất cả các crap đơn dụ bạn không cần. – GManNickG

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