博客
关于我
QT序列化操作
阅读量:800 次
发布时间:2023-03-03

本文共 1477 字,大约阅读时间需要 4 分钟。

在开发过程中,遇到继承自QObject后出现编译错误的问题。错误信息提示“error C2248 'QObject::QObject' : cannot access private member declared in class 'QObject'”,这意味着在基类QObject中构造函数被私藏,无法被子类访问。

分析原因

  • 私藏构造函数:QObject中声明了一个私藏的构造函数QObject(),防止外部直接创建对象。
  • 子类无法调用基类构造:在子类的构造函数中直接调用基类::构造函数会触发私藏函数的访问,导致错误。
  • 影响功能:由于无法正常初始化,可能导致对象无法正确创建,进而引发运行时问题。
  • 解决方法

  • 避免在构造函数中调用基类构造

    • 检查子类构造函数是否有基类构造函数的调用,若有,移除或替换为其他初始化方式。
  • 使用静态成员函数

    • 如果基类有静态成员函数,可以通过调用这些静态函数来初始化对象,而无需调用基类构造函数。
  • 友元函数

    • 声明基类的友元函数,使其能够访问私藏构造函数。例如:
      class LHTFileVersionItem : public QObject {
      Q_OBJECT
      friend class SomeFriend;
      public:
      explicit LHTFileVersionItem();
      private:
      Q_DISABLE_COPY(LHTFileVersionItem)
      // 其他成员
      };
    • 在构造函数中,使用友元类或友元函数来处理基类的初始化。
  • 检查是否需要继承

    • 确认是否真的需要继承自QObject。如果不需要其功能或特定槽,可以考虑不继承,避免问题。
  • 实现步骤

  • 移除基类构造函数调用

    • 在子类构造函数中,移除基类::基类()的调用。例如:
      LHTFileVersionItem::LHTFileVersionItem() {
      // 不需要调用基类构造
      // 可以直接初始化成员变量
      m_hFileVersionPointer = new FileVersionItem();
      }
  • 使用静态初始化

    • 如果基类有静态成员函数或数据,可以通过静态方式初始化。例如:
      LHTFileVersionItem::LHTFileVersionItem() {
      static initStaticMembers();
      // 初始化其他成员
      }
  • 友元声明

    • 在基类中声明友元函数或类,允许访问私藏成员。例如:
      class LHTFileVersionItem : public QObject {
      Q_OBJECT
      friend class SomeFriend;
      friend struct SomeStruct;
      public:
      explicit LHTFileVersionItem();
      private:
      Q_DISABLE_COPY(LHTFileVersionItem)
      // 其他成员
      };
  • 反问与验证

    • 确认是否所有依赖于基类功能的部分都能正常运行。例如,检查是否有其他成员函数或槽依赖于基类提供的功能。
  • 总结

    通过移除基类构造函数调用,结合友元声明和静态初始化方法,可以有效解决继承自QObject后出现的编译错误。关键在于理解私藏构造函数的限制,并找到合适的替代方式来完成对象的初始化。

    转载地址:http://utxfk.baihongyu.com/

    你可能感兴趣的文章
    POJ 1703 Find them, Catch them
    查看>>
    POJ 1703 Find them, Catch them 并查集
    查看>>
    POJ 1738 An old Stone Game(石子合并)
    查看>>
    POJ 1740 A New Stone Game(博弈)题解
    查看>>
    Qt网络编程之实例二POST方式
    查看>>
    POJ 1765 November Rain
    查看>>
    poj 1860 Currency Exchange
    查看>>
    POJ 1961 Period
    查看>>
    POJ 2019 Cornfields (二维RMQ)
    查看>>
    poj 2057 The Lost House 贪心思想在动态规划上的应用
    查看>>
    poj 2057 树形DP,数学期望
    查看>>
    poj 2112 最优挤奶方案
    查看>>
    Qt编写自定义控件12-进度仪表盘
    查看>>
    SpringBoot主启动原理在SpringApplication类《第六课》
    查看>>
    poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)
    查看>>
    POJ 2186:Popular Cows Tarjan模板题
    查看>>
    POJ 2229 Sumsets(递推,找规律)
    查看>>
    poj 2236
    查看>>
    POJ 2243 Knight Moves
    查看>>
    POJ 2262 Goldbach's Conjecture
    查看>>