Как установить значение для указателя, объявленного в заголовочном файле - PullRequest
0 голосов
/ 02 января 2019

У меня есть указатель в заголовочном файле с именем global.h в моем проекте:

int *CorrectID;

и где-то в моем файле mainwindow.cpp у меня есть это:

*CorrectID = ui->lineEdit_CurrentID->text().toInt();

но я получаю эту ошибку:

invalid type argument of unary '*' (have 'uint {aka unsigned int}')
    *CorrectID = ui->lineEdit_CurrentID->text().toInt();
     ^

Ответы [ 2 ]

0 голосов
/ 02 января 2019

У вас проблемы с пониманием работы указателя.

*CorrectID = ui->lineEdit_CurrentID->text().toInt();

Этот код разыменовывает ваш указатель и присваивает значение справа адресу, на который он указывает. Для этого уже нужно указать на какой-то адрес. Прямо сейчас, учитывая код, который вы разместили в своем «ответе», его не будет.

Вам необходимо назначить адрес указателю, иначе он может содержать случайную бессмыслицу, которая легко приводит к сбою. Вы можете сделать это так:

CorrectId = new int;

, который создает новую переменную в куче и использует этот адрес, хотя это, скорее всего, недопустимый идентификатор.

Или, учитывая ваш код ответа, вы можете создать переменную стека в области действия main и установить указатель на нее, хотя это не будет хорошим дизайном.

При этом, наверное, важнее: старайтесь избегать глобальных переменных. Я не знаю ваш дизайн, поэтому я не могу сказать вам, как вы должны это сделать, но то, что указатель является глобальной переменной, для меня - красный флаг. Наличие идентификатора, которым можно манипулировать со всех сторон, также возможно, даже если вместо этого вы используете инъекцию. Скорее всего, вам следует создать класс, который хранит CorrectID в качестве члена и таким образом получает владение . Ссылка на этот класс разделяется путем внедрения, и любые манипуляции с членом выполняются через интерфейс класса. Опять же, я не знаю ваш большой дизайн, но в большинстве случаев это будет путь.

Учитывая ваш другой код, это можно сделать просто, сделав его элементом вашего главного окна. Или у вас есть какой-то другой класс, который управляет вещами, на которые в главном окне есть указатель. Лучше всего было бы, если бы вы дали нам контекст.

Возможный макет вашего проекта:

class IDController
{
    private:
    int _ID;

    public:
    void setID(int ID) { _ID = ID; }
    const int& ID() const { return _ID; }
};

int main(int argc, char *argv[])
{
IDController controller;
QApplication a(argc, argv);
MainWindow w(&a, &IDController);
...
}

class MainWindow : public QMainWindow
{
...
private:
IDController* controller;
...

MainWindow::MainWindow(QWidget* parent, IDController* controller) :
QMainWindow(parent),
controller(controller)
ui(new Ui::MainWindow)
{
...

void MainWindow::on_pushButton_clicked()
{
    controller->setID(6);
}

Имя IDController должно быть заменено более органичным именем, некоторым классом, к которому принадлежит идентификатор. Обратите внимание, что я не инициализирую _ID, что плохо. IDController должен иметь некоторый определенный конструктор. Если идентификатор является очень изменчивым, можно решить удалить метод получения и установки из контроллера и сделать его общедоступным, но, скорее всего, вместо этого вы хотите расширить методы установки и получения для выполнения некоторых дополнительных действий (например, проверки того, что данный идентификатор действует).

0 голосов
/ 02 января 2019

Я создал новый и очень простой проект с одной строкой кода пользователя:

файл global.h:

#ifndef GLOBAL_H
#define GLOBAL_H
int *ID;
#endif // GLOBAL_H

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_pushButton_clicked();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

main.cpp:

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

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

mainwindow.cpp:

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

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

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

void MainWindow::on_pushButton_clicked()
{
*ID = 6;
}

в этой программе я не получаю ошибки, но когда я нажимаю на кнопку, программа вылетает !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...