2009-09-24 49 views
6

Tôi đang sử dụng Qt và trong phương pháp chính, tôi cần khai báo một đối tượng mà tôi cần sử dụng trong tất cả các tệp khác của mình. Làm thế nào tôi có thể truy cập đối tượng đó trong các tệp khác? (Tôi cần phải làm cho nó toàn cầu ..)Biến toàn cầu trong Qt, làm thế nào?

Tôi đang sử dụng để phát triển iPhone và ở đó chúng tôi có appDelegate mà bạn có thể sử dụng trên ứng dụng để tiếp cận các đối tượng bạn đã khai báo trong phương thức applicationDidFinishLaunching. Làm thế nào tôi có thể làm tương tự trong Qt?

Trả lời

8

global_objects.hpp

extern int myGlobalInt; 

global_objects.cpp

#include "global_objects.hpp" 

namespace 
{ 
    int myGlobalInt; 
} 

Và sau đó #include "global_objects.hpp" ở mọi nơi bạn cần myGlobalInt.

Bạn cũng nên đọc C++ singleton vs. global static objectInitializing qt resources embedded in static library.

+0

Bạn đã quên từ khóa 'extern' trong tệp .hpp - điều này sẽ instanciate' myGlobalInt' mỗi lần hpp được bao gồm – bluebrother

+0

@bluebrother Cảm ơn, đã sửa. –

1

Nói chung, bạn không nên sử dụng các biến toàn cầu trong lập trình hướng đối tượng. Trong trường hợp của bạn, bạn có thể giải quyết vấn đề bằng cách cung cấp các hàm truy cập tĩnh cho biến trong lớp chính của bạn. Tuy nhiên, bạn nên biết rằng điều này có phần trái ngược với OOP.

class MainClass 
{ 
    public: 
     static int mySharedValue(void) { return m_mySharedValue; } 
     static void setMySharedValue(int value) { m_mySharedValue = value; } 
    private: 
     static int m_mySharedValue; 
} 

Foo::myOtherClassFunction(void) 
{ 
    // do something 
    int bar = MainClass::mySharedValue(); 
    // do some more 
} 

Hơn nữa, bạn có thể lấy được ứng dụng chính của bạn từ QApplication và thêm các chức năng truy cập đó, việc tiếp cận các đối tượng chính thông qua con trỏ qApp cung cấp bởi Qt. Ngoài ra, bạn luôn có thể sử dụng biến toàn cục giống như cách bạn có thể thực hiện trong C, mặc dù tôi không đề xuất điều đó.

+1

Ý tưởng của tôi để sử dụng đối tượng toàn cầu là bởi vì đối tượng này sẽ giữ dữ liệu mà tôi cần trong hầu hết các widget và dữ liệu đó được lấy từ cơ sở dữ liệu. Nếu tôi không sử dụng một đối tượng toàn cục, tôi cần truy cập cơ sở dữ liệu mỗi khi đối tượng được instanced. Tôi nghĩ tốt hơn là chỉ nên làm một lần, đó là ý tưởng sai lầm? – Martin

2

Trong Qt có singleton QApplication, với phương thức tĩnh QApplication :: instance() cung cấp cho bạn đối tượng QApplication duy nhất và duy nhất trở lại. Nó có nhiều chức năng thành viên tĩnh khác (trong một thời đại trước đó họ được gọi là "globals"), cho MainWindow, cửa sổ hoạt động, vv

http://doc.trolltech.com/4.5/qapplication.html

Bạn có thể sublass nó nếu bạn muốn thêm của riêng bạn thống kê.

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