2016-09-01 6 views
1

QObject에서 파생 된 클래스에 대해 QScopedPointer을 사용합니다.QScopedpointer가 Q_DISABLE_COPY에서 실패합니다.

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    calculationManager(QScopedPointer<CalculationManager>(new CalculationManager())) 

qscopedpointer.h의 라인 :

Q_DISABLE_COPY(QScopedPointer) 

함께 :

,536이하지만 실패 생성자에서

private: 
    QScopedPointer<CalculationManager> calculationManager; 

:

MainWindow

는 그것을 포함
C:\Qt\5.7\mingw53_32\include/QtCore/qscopedpointer.h: In constructor 'MainWindow::MainWindow(QWidget*)': 
C:\Qt\5.7\mingw53_32\include/QtCore/qscopedpointer.h:176:20: error: 'QScopedPointer<T, Cleanup>::QScopedPointer(const QScopedPointer<T, Cleanup>&) [with T = CalculationManager; Cleanup = QScopedPointerDeleter<CalculationManager>]' is private 
    Q_DISABLE_COPY(QScopedPointer) 
        ^

복사가 왜 그리고 어디에서 발생합니까?

답변

3

QScopedPointer에는 이동 생성자가 없습니다. 그 때문에의
,이 라인을 고려하는 경우 : 여기

calculationManager(QScopedPointer<CalculationManager>(new CalculationManager())) 

을 입력 QScopedPointer<CalculationManager>의 임시 개체를 구성하고 calculationManager 데이터 멤버에 복사됩니다.
당신은 여분의 복사본을 방지하기 위해이 작업을 수행 할 수 있습니다

calculationManager(new CalculationManager()) 

그것은 CalculationManager에 대한 포인터를 기대 생성자를 호출하고, 복사는 발생하지 않습니다.