error: 'QObject& QObject::operator=(const QObject)' is private 问题解决

本文详细解析了在Qt编程中遇到的对象复制错误,解释了为何直接使用赋值操作符会引发编译错误,并提供了正确的对象实例化方法。

今天QT编程时遇到了这样的问题:

/opt/QtEmbedded-4.7.3/include/QtCore/qobject.h:309: error: ‘QObject& QObject::operator=(const QObject&)’ is private

/opt/QZXing/QZXing.h:28: error: within this context

弄了一会才明白是我构建对象时出了问题,我的构建过程如下:

QZXing decoder;
decoder = QZXing(QZXing::DecoderFormat_QR_CODE);

正确过程应该是:

QZXing *decoder;
decoder = new QZXing(QZXing::DecoderFormat_QR_CODE);

或者

QZXing decoder(QZXing::DecoderFormat_QR_CODE);

原因在于QZXing这个类是继承了QObject类的,而QObject不允许通过"="操作符进行对象复制。

namespace mypcl { /** * @brief The PCLControler class PCL 控制器,用于控制PCL经典操作,如旋转,放缩,平移。使用时必须先调用setViewer函数,最后必须调用render函数 */ class PCLControler: public common::Singleton<PCLControler> { friend class common::Singleton<PCLControler>; private: pcl::visualization::PCLVisualizer::Ptr viewer; public: enum Axis { X,Y,Z }; private: private: explicit PCLControler(QObject *parent = nullptr); public: ~PCLControler(); PCLControler(const PCLControler&) = delete; PCLControler& operator=(const PCLControler&) = delete; PCLControler& setViewer(const pcl::visualization::PCLVisualizer::Ptr &viewer); /** * @brief zoom pcl点云图放大,缩小 * @param factor 放缩因子, 大于1,放大; 小于1,缩小 */ PCLControler& zoom(double factor); /** * @brief translateToTargetPoint 平移到目标点 * @param targetX 目标点X坐标 * @param targetY 目标点Y坐标 * @param targetZ 目标点Z坐标 */ PCLControler& translateToTargetPoint(double targetX, double targetY, double targetZ); /** * @brief rotateCloud 旋转点云 * @param angleDegrees 旋转角度 * @param axis 旋转轴 */ PCLControler& rotateCloud(double angleDegrees = -45.0, Axis axis = X); /** * @brief resetViewer 重置点云视口,恢复到默认 * @param cloud_namn 点云名字 * @return */ PCLControler& resetViewer(const QString &cloud_namn); /** * @brief view 点云图视图,根据传入的值,显示不同视图 * @param pos_x * @param pos_y * @param pos_z * @param view_x * @param view_y * @param view_z * @param up_x * @param up_y * @param up_z * @return */ PCLControler& view(double pos_x, double pos_y, double pos_z, double view_x, double view_y, double view_z, double up_x, double up_y, double up_z); /** * @brief render 强制渲染 * @return */ PCLControler& render(); }; class PCDLoader: public QThread { Q_OBJECT private: explicit PCDLoader(QObject* parent=nullptr); private: pcl::PointCloud<pcl::PointXYZ>::Ptr m_cloud; QString m_pcdFileName; public: static PCDLoader& instance(); signals: void startLoadLCD(); void loadPCDFileSucessed(); void loadPCDFileFinished(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud); void loadPCDFileFailed(); public: const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud() const; public slots: void startLoader(const QString& pcdFileName); private: friend class QSharedPointer<PCDLoader>; // QThread interface protected: void run() override; }; class PCDAttribute: public QThread { Q_OBJECT private: explicit PCDAttribute(QObject* parent=nullptr); private: pcl::PointCloud<pcl::PointXYZ>::Ptr m_cloud; // 点云中心点 Eigen::Vector4f m_centroid; // 点云边界 pcl::PointXYZ m_minPt, m_maxPt; public: static PCDAttribute& instance(); signals: void attriComputed(); public: const Eigen::Vector4f& centroid() const; const pcl::PointXYZ& minPt() const; const pcl::PointXYZ& maxPt() const; public slots: void startComputeAttri(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud); private: friend class QSharedPointer<PCDAttribute>; // QThread interface protected: void run() override; }; } 注释上述代码
09-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值