2012-07-03 34 views
6

Tôi có một ứng dụng MainWindow tôi đang làm việc để tìm hiểu C++ và Qt (C++ và QT 4.8). Tôi muốn thực hiện các yêu cầu HTTP trong các đối tượng khác nhau của ứng dụng, chẳng hạn như Dialogs/Wizard và trong MainWindow. Tôi biết tôi về cơ bản có một QNetworkAccessManager cho mỗi ứng dụng. Câu hỏi của tôi là, cách thích hợp để vượt qua QNAM này giữa các lớp là gì?Cách sử dụng QNetworkAccessManager trong các lớp khác nhau? Chia sẻ chung dữ liệu quan trọng giữa các lớp học?

Hiện tại tôi có nó như một con trỏ tôi chuyển đến hàm tạo của trình hướng dẫn của tôi nhưng điều này có vẻ ... không phù hợp và không linh hoạt. Cách thích hợp để cung cấp cho Hộp thoại của tôi hoặc bất kỳ lớp nào khác mà tôi quyết định thực hiện, truy cập vào một QNetworkAccessManager của tôi là gì? Tôi đoán tôi có cùng một câu hỏi về bất kỳ phần dữ liệu nào tôi cần để cung cấp mọi thứ truy cập.

Giải pháp được thiết kế phù hợp với C++ ở đây là gì? Các mẫu đơn có vẻ như một lựa chọn, nhưng một xấu như tôi hiểu. Tôi có một chút mã ở đây để hiển thị câu hỏi của tôi.

constructor MainWindow tôi và khe mà khởi động thuật sĩ của tôi:

MyMainWindow::MyMainWindow 
{ 
    qnam = new QNetworkAccessManager(); 
} 

... 

MyMainWindow::wizardStarter 
{ 
    mywizard = MyWizard(vari, qnam, this); 
} 

My Hướng dẫn Constructor trong đó tôi đang làm cho các yêu cầu mạng và phân tích dữ liệu sau khi nhận được dữ liệu từ người dùng, và do đó mà tôi cần một QNetworkAccessManager :

MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent) 
{ 
    ... 
    this->ourQnam = qnam; 
    ... 
} 

MyWizard::launchRequest(QUrl newUrl) 
{ 
    ourQnam->get(QNetworkRequest(newUrl)); 
} 
+0

Tôi khuyên bạn nên mẫu thiết kế Singleton. Tại sao bạn nghĩ rằng mô hình này là xấu? – hamed

+1

@hamed, singletons ẩn mối quan hệ phụ thuộc giữa các lớp nếu bạn không sử dụng tiêm phụ thuộc thích hợp. Không có gì sai với mẫu thiết kế singleton chỉ sử dụng tiêm thích hợp để giao tiếp rằng lớp học của bạn phụ thuộc vào singleton của bạn. – Matthew

+0

Làm thế nào để thêm một tiêm thích hợp trong trường hợp của một singleton? – MJBoa

Trả lời

5

Từ câu hỏi của bạn, tôi nghĩ rằng bạn đang thực sự yêu cầu lựa chon hình thức dependency injection (tức là tiêm tùy theo tính chất của bạn dent QNetworkAccessManager vào các đối tượng) để sử dụng.

Trong trường hợp bạn đang sử dụng Tiêm xây dựng. Đây là một dạng tiêm được chấp nhận hoàn hảo và được chấp nhận. Nó giao tiếp mạnh mẽ lớp học thuật sĩ của bạn phụ thuộc vào QNetworkAccessManager giúp mã của bạn dễ hiểu cho mọi người. Nếu bạn sử dụng một singleton đơn giản chỉ cần lấy một QNetworkAccessManager tĩnh từ bên trong việc thực hiện lớp wizard, trong khi nó có lợi ích của việc loại bỏ việc xây dựng constructor, nó ẩn rằng lớp wizard của bạn sử dụng QNetworkAccessManager.

Một hình thức nổi tiếng của tiêm là Setter tiêm ví dụ: setDelegate(delegate)

chuyên nghiệp nói không có gì sai với cách tiếp cận hiện tại của bạn là như một lần nữa nó truyền đạt rõ ràng lớp wizard phụ thuộc vào đối tượng QNetworkAccessManager.

Đây là một chút đọc nếu bạn quan tâm đến việc tìm hiểu thêm về tiêm phụ thuộc.

Dependency Injection

Dependency Injection in C++

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