Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我能够为QObject子类创建复制构造函数并重载赋值运算符?_C++_Qt_Qobject - Fatal编程技术网

C++ 为什么我能够为QObject子类创建复制构造函数并重载赋值运算符?

C++ 为什么我能够为QObject子类创建复制构造函数并重载赋值运算符?,c++,qt,qobject,C++,Qt,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 val

我的印象是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
\ifndef qu H版本
#定义QU版本
#包括“silverlocklib_global.h”
#包括
结构SILVERLOCKLIBSHARED_导出QVersion:公共QObject
{
Q_对象
Q_属性(bool valid READ isValid)
Q_属性(长主修读主修)
Q_属性(长小调读取小调)
Q_属性(长构建-读取构建)
Q_属性(长版本读取版本)
公众:
QVersion(长主版本=0,长次版本=0,长构建版本=-1,长修订版本=-1,QObject*父版本=NULL);
QVersion(常量QString&version,QObject*parent=NULL);
QVersion(常数QVersion&version);
静态QVersion解析(const QString&version,bool*ok=NULL);
bool isValid()常量;
长比较(常数QVersion和其他)常数;
布尔等于(常数QVersion和其他)常数;
QString toString()常量;
QString-toString(int-fieldCount)常量;
长大调()常数;
inline int majorRevision()常量{return(qint16)(this->m_revision>>16);}
长小调()常数;
inline int minorRevision()常量{return(qint16)(this->m_revision&65535);}
长构建()常量;
长修订()常量;
QVersion和operator=(常量QVersion和version);
friend bool运算符==(常数QVersion&v1,常数QVersion&v2);
友元布尔运算符!=(常数QVersion&v1,常数QVersion&v2);
friend bool运算符=(常数QVersion&v1,常数QVersion&v2);
私人:
内联静态无效副本(QVersion*常量目标、常量QVersion和源);
静态bool tryParseComponent(常量QString&component,long*parsedComponent);
朗穆大校;
小调长音符;
长毛坯;
长m_修订;
};
#endif//qu版本

派生类始终可以声明自己的复制构造函数和赋值运算符。如果基类通过将其设置为私有并保留未定义来禁用它,那么派生类当然不能在自己的实现中调用基类的版本,但它仍然可以实现它们。

派生类始终可以声明自己的复制构造函数和赋值运算符。如果基类通过将其设置为私有并保留其未定义来禁用它,那么派生类当然不能在其自己的实现中调用基类的版本,但它仍然可以实现它们。

这是Omnifarious“答案”的补充。正如他所说的,您可以实现派生类的复制构造函数,但不能使用基类的复制构造函数初始化基类中的数据成员


如果您没有指定初始化基类数据成员的构造函数,编译器将使用基类的默认构造函数。

作为Omnifarious答案的补充。正如他所说的,您可以实现派生类的复制构造函数,但不能使用基类的复制构造函数初始化基类中的数据成员


如果未指定初始化基类数据成员的构造函数,编译器将使用基类的默认构造函数。

“已禁用”?C++中没有这样的特性,即“禁用”复制构造函数、赋值操作符或其他任何东西。你这是什么意思?安德烈:你可以把它们保密。当然,任何子类都可以使它们再次公开。无论如何,它们对QoObject毫无意义。QoObject有一个“标识”,这些假设在复制或分配它们时会被打破。“已禁用”?C++中没有这样的特性,即“禁用”复制构造函数、赋值操作符或其他任何东西。你这是什么意思?安德烈:你可以把它们保密。当然,任何子类都可以使它们再次公开。无论如何,它们对QoObject毫无意义。QoObject有一个“标识”,这些假设在复制或分配它们时会被打破。