2013-09-30 12 views
8

Mam klasy, która jest publicznie odziedziczoną QWidget:kopia konstruktor pochodzącego klasie QT

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

private: 
    some_class obj1; 
    some_class obj2; 
}; 

Kiedy zbudowany mojego projektu, kompilator narzeka:

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

I wyrejestrowany z innych pytań na stackoverflow, i dostałem moją odpowiedź. Ale faktem jest, kiedy dodałem, że inicjowanie takiego:

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; 
}; 

Dostałem błąd kompilacji:

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

Tak, proszę wyjaśnić mi, co robię źle.

+5

Wydaje się, że 'QWidget' nie jest przeznaczony do kopiowania constructible, co oznacza twój typ pochodny nie powinno być. – juanchopanza

+0

Czy jawnie utworzono konstruktor kopii dla 'QWidget' lub pozostawiłeś go kompilatorowi? – Olayinka

+0

Nie trzeba tworzyć Copy-Constructor dla QWidget. Mogę tylko zainicjować obiekt wywołujący QWidget :: Cpoy-Constructor na liście init konstruktora kopiowania mojego obiektu. –

Odpowiedz

16

QObject Class opis strona mówi:

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.

Oznacza to, że nie mają skopiować obiekty QT, ponieważ QObject nie jest copyable projektem.

Pierwsze ostrzeżenie mówi, aby zainicjować klasę podstawową (która jest QWidget). Jeśli chcesz to zrobić, skonstruujesz nowy obiekt bazowy i wątpię, czy to właśnie chcesz zrobić.

Drugi błąd mówi ci, co napisałem powyżej: nie kopiuj obiektów qt.

9

Wszystkie klasy Qt są niemożliwe do skopiowania przez wyprowadzenie z QObject.

Powszechną praktyką w C++ jest zabronienie pewnych operacji wartościowo-semantycznych, takich jak kopiowanie na obiektach polimorficznych. Qt podaje kilka przykładów problemów, które mogłyby się pojawić, jeśli kopia pozwolono na QObject w swojej documentation:

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?