2010-04-16 51 views
9

Tôi đang sử dụng Qt và có một số vấn đề cơ bản thực sự. Tôi đã tạo tiện ích MyTest của riêng mình có biến số obj. Tôi cần phải đặt biến này obj từ một đối tượng bên ngoài tiện ích để biến được sao chép không chỉ là con trỏ đến đối tượng khác. Tôi nhận được thông báo lỗi và không thể tìm ra cách thực hiện công cụ cơ bản này. Đây là mã Tôi đang sử dụng:Làm thế nào để sao chép đối tượng trong Qt?

MyTest.h:

class MyTest : public QWidget 
{ 
    Q_OBJECT 

    public: 
     void setObj(QObject &inobj); 

     QObject obj; 
    .... 
} 

MyTest.cpp:

void MyTest::setObj(QObject &inobj) { 
    obj = inobj; //HERE I get the error message: "illegal access from 'QObject' to protected/private member 'QObject::operator=(const QObject &)'" 
} 

main.cpp:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QObject *ob = new QObject(); 

    MyTest w; 
    w.setObj(*ob); 
} 

Trả lời

24

Có vẻ như bản sao constructor và toán tử gán được vô hiệu hóa. Từ this.

Không constructor sao chép hoặc toán tử gán

QObject có không phải là một constructor sao chép hay một toán tử gán. Điều này là do thiết kế. Trên thực tế, chúng được khai báo, nhưng trong một phần riêng với macro Q_DISABLE_COPY(). Trong thực tế, tất cả các lớp Qt có nguồn gốc từ QObject (trực tiếp hoặc gián tiếp) sử dụng macro này để khai báo hàm tạo bản sao và toán tử gán của chúng là riêng tư. Lý do được tìm thấy trong cuộc thảo luận trên Identity vs Value trên trang Qt Object Model.

Hậu quả chính là bạn nên sử dụng con trỏ tới QObject (hoặc tới lớp con QObject), nơi bạn có thể bị cám dỗ sử dụng phân lớp QObject của bạn làm giá trị. Ví dụ, nếu không có một hàm tạo bản sao, bạn không thể sử dụng một lớp con của QObject làm giá trị được lưu trữ trong một trong các lớp chứa. Bạn phải lưu trữ con trỏ.

+1

Tôi muốn làm rõ rằng không có gì ngăn cản bạn sử dụng macro Q_DISABLE_COPY ngay cả khi lớp học của bạn không xuất phát từ QObject, vì nó không liên quan gì đến QObject. – rightaway717

3

Aaron chính xác về việc sử dụng toán tử gán.

Cách duy nhất mà tôi biết là tạo một bản sao của một đối tượng, nếu bạn thực sự phải làm, là sử dụng Serialization như được mô tả trong Lớp QDataStream. Điều này sẽ tạo một bản sao sâu của đối tượng.

Hoặc bạn đã xem xét gói lớp như một con trỏ QSharedPointer mà bạn có thể an toàn vượt qua. Đây sẽ là một bóng hoặc bản sao tham chiếu của đối tượng mặc dù.

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