zoukankan      html  css  js  c++  java
  • C++.构造函数(超出范围)_01

    环境:Win7x64、Qt5.3.2 MSVC2010 OpenGL、vs2010

    1、ZC:在 构造函数 中,基类访问子类的成员 会报内存错误,如果访问的是 基本类型的话(如int) 可能还不会出错,如果访问的是 类似 QList<Tbase*>类型的成员的话 就会出错。

      本类构造函数 访问 本类的成员或者基类的成员的话,不会出错(∵ 也就是这么做的,如初始化成员变量)

      猜想:本类访问子类的 成员变量的时候,可能有些成员变量还未分配好空间??(反正这样做就是不可靠...)

    2、测试代码:

    #include <QDebug>
    #include <QMap>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    class TA;
    
    class Tbase
    {
    public:
        Tbase();
    
    public:
        int FiBase;
    
    public:
        QList<Tbase*> FlistBase;
        void AddBase(Tbase *_p);
    };
    
    class TA :public Tbase
    {
    public:
        TA():Tbase(){}
    
    public:
        int FiA;
        void SetA(int _i) {FiA = _i;}
    
    public:
        QList<Tbase*> FlistA;
        void AddA(Tbase *_p);
    };
    
    Tbase::Tbase()
    {
        ((TA*)this)->FiA = 10;
        ((TA*)this)->SetA( 50 );
    
        this->AddBase(this);
        ((TA*)this)->AddA(this);
    }
    
    void Tbase::AddBase(Tbase *_p)
    {
      qDebug() << "Tbase::AddBase(..) - 1";
        if (-1 == FlistBase.indexOf(_p))
        {
        qDebug() << "Tbase::AddBase(..) - 2";
            FlistBase.append(_p);
        qDebug() << "Tbase::AddBase(..) - 3";
        }
      qDebug() << "Tbase::AddBase(..) - 4";
    }
    
    void TA::AddA(Tbase* _p)
    {
      qDebug() << "TA::AddA(..) - 1";
        if (-1 == FlistA.indexOf(_p))
        {
        qDebug() << "TA::AddA(..) - 2";
            FlistA.append(_p);
        qDebug() << "TA::AddA(..) - 3";
        }
      qDebug() << "TA::AddA(..) - 4";
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        TA a;// = new TA;
        qDebug() << a.FiA;
    }

    3、控制台输出:

    Starting E:Z_Qt5Qt532_vs2010uild-Test2-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Release
    eleaseTest2.exe...
    Tbase::AddBase(..) - 1
    Tbase::AddBase(..) - 2
    Tbase::AddBase(..) - 3
    Tbase::AddBase(..) - 4
    TA::AddA(..) - 1
    TA::AddA(..) - 2
    程序异常结束。
    E:Z_Qt5Qt532_vs2010uild-Test2-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Release
    eleaseTest2.exe crashed

    4、

    5、

  • 相关阅读:
    WPF资源字典使用
    忍住你的痛苦
    WPF附加属性
    一致性Hash算法详解
    登录注册
    REST
    资源访问
    参与Bean的生命周期
    sqlserver中查询横表变竖表的sql语句简析
    C#跨线程修改控件——从MSIL和汇编看Invoke, 多线程, 事件与事件委托
  • 原文地址:https://www.cnblogs.com/cppskill/p/9518577.html
Copyright © 2011-2022 走看看