2013-09-30 12 views
8

Tôi có một lớp học mà được công khai thừa hưởng từ QWidget:copy constructor của lớp QT có nguồn gốc

class MyWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    MyWidget(const MyWidget& other) 
     : 
    obj1(other.obj1), 
    obj2(other.obj2) 

private: 
    some_class obj1; 
    some_class obj2; 
}; 

Khi tôi xây dựng dự án của tôi, biên dịch phàn nàn:

WARNING:: Base class "class QWidget" should be explicitly initialized in the copy constructor.

Tôi chọn ra từ các câu hỏi khác về stackoverflow, và nhận được câu trả lời của tôi. Nhưng thực tế là, khi tôi nói thêm rằng khởi như thế này:

class MyWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    MyWidget(const MyWidget& other) 
     : 
    QWidget(other), //I added the missing initialization of Base class 
    obj1(other.obj1), 
    obj2(other.obj2) 

private: 
    some_class obj1; 
    some_class obj2; 
}; 

tôi đã biên dịch báo lỗi:

QWidget::QWidget(const QWidget&) is private within this context

Vì vậy, xin vui lòng giải thích cho tôi những gì tôi đang làm sai.

trang mô tả
+5

Có vẻ như rằng 'QWidget' không được thiết kế để được sao chép constructible, có nghĩa là loại có nguồn gốc của bạn không nên là một trong hai. – juanchopanza

+0

Bạn đã tạo một cách rõ ràng một hàm tạo bản sao cho 'QWidget' hoặc bạn để nó cho trình biên dịch? – Olayinka

+0

Tôi không cần phải tạo một Copy-Constructor cho QWidget. Tôi chỉ có thể khởi tạo đối tượng gọi QWidget :: Cpoy-Constructor trong danh sách init của hàm tạo bản sao của đối tượng của tôi. –

Trả lời

16

QObject Class nói:

QObject has neither a copy constructor nor an assignment operator. This is by design. Actually, they are declared, but in a private section with the macro Q_DISABLE_COPY(). In fact, all Qt classes derived from QObject (direct or indirect) use this macro to declare their copy constructor and assignment operator to be private. The reasoning is found in the discussion on Identity vs Value on the Qt Object Model page.

Điều đó có nghĩa bạn đang không được phép sao chép đối tượng QT, vì QObject là phi copyable do thiết kế.

Cảnh báo đầu tiên cho bạn biết để khởi tạo lớp cơ sở (là QWidget). Nếu bạn muốn làm điều này, bạn sẽ xây dựng một đối tượng cơ sở mới, và tôi nghi ngờ đó là những gì bạn muốn làm.

Lỗi thứ hai cho bạn biết những gì tôi đã viết ở trên: không sao chép các đối tượng qt.

9

Tất cả các lớp Qt đều không thể đọc được bằng cách lấy từ QObject.

Thực tiễn phổ biến trong C++ là cấm các hoạt động giá trị ngữ nghĩa nhất định như sao chép trên các đối tượng đa hình. Qt đưa ra một số ví dụ về những vấn đề mà sẽ xảy ra nếu bản sao được phép cho QObject trong documentation của nó:

A Qt Object...

  • might have a unique QObject::objectName(). If we copy a Qt Object, what name should we give the copy?
  • has a location in an object hierarchy. If we copy a Qt Object, where should the copy be located?
  • can be connected to other Qt Objects to emit signals to them or to receive signals emitted by them. If we copy a Qt Object, how should we transfer these connections to the copy?
  • can have new properties added to it at runtime that are not declared in the C++ class. If we copy a Qt Object, should the copy include the properties that were added to the original?
Các vấn đề liên quan