2012-02-29 26 views
5

Điều này thực sự giống như một lỗi trong Qt. Bất cứ ai có một giải pháp hoặc tôi nên nộp nó như là một lỗi?Không thể truy cập thành viên riêng được khai báo trong lớp 'QReadWriteLock'Error lỗi C2248:' QReadWriteLock :: QReadWriteLock '

#include <QReadWriteLock> 

class FileInfoWrapper { 

public: 
    explicit FileInfoWrapper(const QFileInfo& _fileInfo); 
    ~FileInfoWrapper(); 

private: // also tried public 
    mutable QReadWriteLock lock_; 

Trước khi thậm chí sử dụng nó, tôi nhận được lỗi:

Error 1 error C2248: 'QReadWriteLock::QReadWriteLock' : cannot access private member declared in class 'QReadWriteLock'

Không quan trọng nếu nó private/public hoặc những gì lớp tôi bao gồm. Tôi dường như không thể tạo nó trên ngăn xếp. Thay vào đó tôi đã tạo một trên heap sử dụng 'mới', nhưng khi tôi cố gắng để xóa nó trong constructor treo ứng dụng của tôi với:

Unhandled exception at 0x5090f39a (QtCored4.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfeeeff0e.

Gọi stack:

QtCored4.dll!QHash::~QHash() Line 283 + 0xa bytes C++ QtCored4.dll!QReadWriteLockPrivate::~QReadWriteLockPrivate() + 0x38 bytes C++ QtCored4.dll!QReadWriteLockPrivate::`scalar deleting destructor'() + 0xf bytes C++ QtCored4.dll!QReadWriteLock::~QReadWriteLock() Line 137 + 0x1e bytes C++ CloudSync.exe!FileInfoWrapper::~FileInfoWrapper() Line 76 + 0x15 bytes C++

Biến 'd' trong QReadWriteLockPrivate dường như bị xóa hai lần. Tuy nhiên, điều này làm việc trong một lớp khác, nơi tôi cũng đã phải tạo khóa trên heap và sau đó xóa nó trong constructor.

Chạy Qt 4.8.0 trong Visual Studio. Đã có cùng một vấn đề trong Qt creator 4.7.4.

+0

Không thể sao chép bằng Qt 4.7.4, MinGW, Windows 7 x64. –

Trả lời

6

Bạn phải sử dụng con trỏ vì QReadWriteLock không thể sao chép được (nó sử dụng Q_DISABLE_COPY) và bằng cách nào đó bạn sao chép các đối tượng FileInfoWrapper của mình (bằng cách lưu trữ chúng trong vùng chứa).
Vì vậy, địa chỉ con trỏ được chia sẻ giữa các bản sao đó và bị xóa một lần cho mỗi bản sao.

Bạn có thể quấn con trỏ bên trong một con trỏ thông minh, do đó việc xóa sẽ chỉ xảy ra khi bản sao cuối cùng của đối tượng của bạn bị xóa.

QSharedPointer<QReadWriteLock> lock_; 
+0

Vì vậy, không cần phải xóa nó trong constructor fileWrappers? Và có, tôi có một danh sách các tập tin này, nhưng tôi vẫn không bỏ rơi. Tôi có trong lý thuyết chỉ có một khóa mà tất cả các đối tượng chia sẻ? Và nếu tôi có một lớp mà tôi sẽ chỉ có một và muốn khai báo điều này trên stack, tôi có thể sử dụng macro Q_DISABLE_COPY trong lớp của mình không? – chikuba

+0

** 1. ** Có, bạn sẽ không cần xóa nó một cách rõ ràng trong trình phá hủy nữa. ** 2. ** Các khóa sẽ được chia sẻ giữa các bản sao của cùng một đối tượng 'FileInfoWrapper', nếu bạn tạo 2 đối tượng FileInfoWrapper' từ đầu (mặc dù hàm tạo của bạn đang sử dụng QFileInfo'), sẽ có 2 khóa độc lập. ** 3. ** Nếu bạn có nghĩa là chỉ cho phép một cá thể của một lớp cho toàn bộ ứng dụng, bạn nên thử một "mẫu đơn" thay thế. – alexisdm

+0

Tôi không bao giờ sao chép FileInfoWrapper, chỉ có rất nhiều trường hợp của đối tượng. Nhưng bạn có nghĩa là nếu tôi có một trong những đối tượng bên ngoài danh sách? Không có ý nghĩa – chikuba

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