invalid use of member 'MainWindow::account' in static member function

Qt. Из одного файла передаю объект класса в другой файл. Вод код mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <string>
#include <QDebug>
#include "mainmenu.h" // для создания объекта окна mainmenu чтобы переходить в это окно 

using namespace std;
class RegData;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    RegData *account; // для передачи в другое окно
    ~MainWindow();

private slots:
    void on_button_reg_clicked();

    void on_button_log_clicked();

private:
    Ui::MainWindow *ui;
    Mainmenu *second;
};
class RegData
{
private:
    QString login;
    QString email;
    QString password;
public:
    RegData(QString log = "", QString mail = "", QString pass = "") : login(log), email(mail), password(pass)
    {
    }
    RegData(const RegData& src) :
        login(src.login), email(src.email), password(src.password)
    {
    }
    void cpy(const RegData& from)
    {
        login = from.login;
        email = from.email;
        password = from.password;
    }

    void output()
    {
        qDebug() << login<<email<<password;
    }
    QString getLogin()
    {
        return login;
    }
    QString getEmail()
    {
        return email;
    }
    QString getPassword()
    {
        return password;
    }

    void setLogin(const QString log)
    {
        login = log;
    }
    void setEmail(const QString mail)
    {
        email = mail;
    }
    void setPassword(const QString pass)
    {
        password = pass;
    }
};
#endif // MAINWINDOW_H

Передавать файл мне нужно в mainmenu.cpp, вот он:

#include "mainmenu.h"
#include "ui_mainmenu.h"
#include "mainwindow.h"

Mainmenu::Mainmenu(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Mainmenu)
{
    ui->setupUi(this);
}

Mainmenu::~Mainmenu()
{
    delete ui;
}

void Mainmenu::on_plus_clicked()
{
    QString name = MainWindow::account->getLogin(); // здесь ошибка
    ui->label->setText(name);
}

В mainwindow.cpp я присваиваю значения для передаваемого объекта путем копирования через функцию (в классе) "cpy". Где ошибка я написал выше в комментарии к коду, а вот сама ошибка:

C:\Users\david\Documents\Carsharring_files\mainmenu.cpp:19: ошибка: invalid use of non-static data member 'MainWindow::account' QString name = MainWindow::account->getLogin(); ^

Если написать

static RegData *account;

выводит

mainwindow.cpp167: ошибка: undefined reference to `MainWindow::account'

в указанной строке присваивание (копирование функция) account->cpy(*it);

Надеюсь на помощь.


Ответы (1 шт):

Автор решения: V31R

У вас ошибка буквально означает то, что вы делаете неправильно. Ваш класс MainWindow содержит поле public: RegData *account, но оно не является статическим членом класса. Не статические члены существуют только внутри объекта класса и к ним невозможно получить доступ не обращаясь к объекту. Обращение через MainWindow::account подразумевает, что это поле должно быть статическим, то есть объявление должно выглядеть так:

static RegData *account;

Но вообще старайтесь избегать использования public полей, это нарушает принцип инкапсуляции и делает код запутаннее. Поэтому, если возможно, лучше передавать объект, к полю которого будет идти обращение.

Также, поскольку Вы используете Qt, то для передачи данных между объектами можете использовать механизм слотов и сигналов.

Также, поскольку идёт работа с указателем, то необходимо выделить память, а в конце работы её очистить. То есть перед использованием поля account необходимо выделить место под объект класса RegData: MainWindow::account = new RegData();. А в конце программы сделать delete MainWindow::account;. Также существуют умные указатели, которые избавляют от вопроса уборки памяти.

→ Ссылка