如何将值设置为在头文件中声明的指针

时间:2019-01-02 09:36:59

标签: c++ qt

在我的项目中名为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 :(得分:0)

我只用一行用户代码构建了一个新的非常简单的项目:

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;
}

在此程序上我没有任何错误,但是当我单击按钮时,程序崩溃了!

答案 1 :(得分:0)

您似乎无法理解指针的工作原理。

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

该代码取消引用您的指针,并将右侧的值分配给它指向的地址。这样做,它已经需要指向某个地址。现在,考虑到您在“答案”中发布的代码,就没有了。

您需要为指针分配一个地址,否则,它可能包含随机的废话,很容易导致崩溃。您可以这样做:

CorrectId = new int;

哪个将在堆上创建一个新变量并使用该地址,尽管该地址很可能不是有效的ID。

或者给定您的“答案”代码,您可以在main范围内创建一个堆栈变量并设置指向它的指针,尽管这不是一个好的设计。

那也许更重要:避免全局变量。我不知道您的设计,因此无法告诉您应该怎么做,但是将指针作为全局变量对我来说是一个危险的信号。即使可以使用注入,也具有可以从各个方向操作的ID。最有可能的是,您应该创建一个将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所属的某些类。请注意,我没有初始化_ID,这很糟糕。 IDController应该具有一些已定义的构造函数。如果ID非常不稳定,则可以决定从控制器中删除该getter和setter并将其公开,但是最有可能的是,您想扩展该setter和getter以做一些其他事情(例如验证给定的ID有效)。