【问题标题】:accessing a class member from another class in c++从 C++ 中的另一个类访问类成员
【发布时间】:2018-04-29 18:12:27
【问题描述】:

我正在尝试访问在另一个类中声明为属性的类的成员。

项目类有一个workArea,也是project.h中定义的一个类。

我在 main 中实例化一个项目,然后通过它的构造函数将它发送到 mainWindow。一旦进入 mainWindow 构造函数,我尝试访问 project->lat 工作正常,但 project->workArea->latInf 崩溃。

我们将不胜感激。

project.h

#ifndef PROJECT_H
#define PROJECT_H

#include <QObject>

class WorkArea{
public://attributes
  int latInf = 30;
public://methods
  WorkArea()//Default constructor
  {
  }
  ~WorkArea();
};


class Project : public QObject
{
  Q_OBJECT
public: //attributes
  int lat = 20;
  WorkArea* workArea;
public: //methods
  explicit Project(QObject *parent = nullptr);
signals:
public slots:
};


#endif // PROJECT_H

ma​​in.cpp

#include "ui/mainwindow.h"
#include <QApplication>

#include "project.h"


int main(int argc, char *argv[])
{
  Project* pj;

    QApplication app(argc, argv);
    MainWindow w( 0 , pj);
    w.show();

    return app.exec();
}

ma​​inWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent, Project *project) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    try
    {
      qDebug() << "Project latInf" << project->lat << "\n"; // works fine
      qDebug()<< "Project lowLeft: " << project->workArea->latInf << "\n" ; // crashes
    }
    catch(std::exception &ex)
    {
      qDebug() << ex.what() ;

    }
    catch (...)
    {

    }
}

【问题讨论】:

  • project.cpp????
  • 你在哪里创建workArea?,例如workArea = new WorkArea;
  • #include "project.h" Project::Project(QObject *parent) : QObject(parent) { }
  • Project::Project(QObject *parent) : QObject(parent) { }更改为Project::Project(QObject *parent) : QObject(parent) { workArea = new WorkArea; }
  • workArea是一个指针,它不创建WorkArea对象,它只能存储一个WorkArea对象的内存地址

标签: c++ qt pointers exception


【解决方案1】:

就是这样。谢谢@eyllanesc。我忘了创建工作区。我虽然只是在 Project 中将其实例化为属性很好,但我必须在 project 的构造函数中填充该内存空间。

project.h

#ifndef PROJECT_H
#define PROJECT_H

#include <QObject>

class WorkArea{
public://attributes
  int latInf = 30;
public://methods
  WorkArea()//Default constructor
  {
  }
  ~WorkArea();
};


class Project : public QObject
{
  Q_OBJECT
public: //attributes
  int lat = 20;
  WorkArea* workArea;
public: //methods
  explicit Project(QObject *parent = nullptr){
    workArea = new WorkArea;
  }
signals:
public slots:
};


#endif // PROJECT_H

【讨论】:

  • 作为一般规则,为了提高效率,您可能希望使用初始化列表而不是构造函数主体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多