2010-06-19 4 views
1

QObject가 복사 생성자와 할당 연산자를 사용할 수 없다는 인상하에있었습니다 ... 왜이 두 QObject 파생물을 모두 포함 할 수 있습니까?복사 생성자를 만들고 QObject 하위 클래스에 대입 연산자를 오버로드 할 수있는 이유는 무엇입니까?

#ifndef QVERSION_H 
#define QVERSION_H 

#include "silverlocklib_global.h" 
#include <QtCore> 

struct SILVERLOCKLIBSHARED_EXPORT QVersion : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(bool valid READ isValid) 
    Q_PROPERTY(long major READ major) 
    Q_PROPERTY(long minor READ minor) 
    Q_PROPERTY(long build READ build) 
    Q_PROPERTY(long revision READ revision) 

public: 
    QVersion(long major = 0, long minor = 0, long build = -1, long revision = -1, QObject *parent = NULL); 
    QVersion(const QString &version, QObject *parent = NULL); 
    QVersion(const QVersion &version); 
    static QVersion parse(const QString& version, bool *ok = NULL); 
    bool isValid() const; 
    long compareTo(const QVersion &other) const; 
    bool equals(const QVersion &other) const; 
    QString toString() const; 
    QString toString(int fieldCount) const; 
    long major() const; 
    inline int majorRevision() const { return (qint16)(this->m_revision >> 16); } 
    long minor() const; 
    inline int minorRevision() const { return (qint16)(this->m_revision & 65535); } 
    long build() const; 
    long revision() const; 
    QVersion& operator=(const QVersion &version); 
    friend bool operator==(const QVersion &v1, const QVersion &v2); 
    friend bool operator!=(const QVersion &v1, const QVersion &v2); 
    friend bool operator<(const QVersion &v1, const QVersion &v2); 
    friend bool operator<=(const QVersion &v1, const QVersion &v2); 
    friend bool operator>(const QVersion &v1, const QVersion &v2); 
    friend bool operator>=(const QVersion &v1, const QVersion &v2); 

private: 
    inline static void copy(QVersion *const destination, const QVersion &source); 
    static bool tryParseComponent(const QString &component, long *parsedComponent); 

    long m_major; 
    long m_minor; 
    long m_build; 
    long m_revision; 
}; 

#endif // QVERSION_H 
+0

"사용 안 함"? C++에는 복사 생성자, 할당 연산자 또는 다른 것을 "비활성화"하는 기능이 없습니다. 그게 무슨 뜻 이니? – AnT

+0

AndreyT : 개인을 비공개로 설정할 수 있습니다. 그러나 모든 하위 클래스를 공개 할 수 있습니다. 어쨌든 그들은 QObjects에 대해 아무런 의미가 없습니다. QObject는 "ID"를 가지며 복사 또는 할당시 이러한 가정이 깨집니다. –

답변

6

파생 클래스는 항상 자체 생성자 및 할당 연산자를 선언 할 수 있습니다. 기본 클래스가 비공개로 설정하여 비공개로 설정하면 파생 클래스는 자체 구현에서 기본 클래스의 버전을 호출 할 수 없지만이를 구현할 수 있습니다.

1

옴니버스의 답변과 마찬가지로. 그가 말했듯이 파생 클래스의 복사 생성자를 구현할 수 있지만 기본 클래스의 복사 생성자를 사용하여 기본 클래스의 데이터 멤버를 초기화 할 수는 없습니다.

기본 클래스 데이터 멤버를 초기화 할 생성자를 지정하지 않으면 컴파일러에서 기본 클래스의 기본 생성자를 사용합니다.

관련 문제