簡體   English   中英

如何將值設置為在頭文件中聲明的指針

[英]How to set value to a pointer declared in a header file

我在項目中的名為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();
     ^

我僅用一行用戶代碼構建了一個新的非常簡單的項目:

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

在這個程序上我沒有錯誤,但是當我點擊按鈕時,程序崩潰了!

您似乎在理解指針的工作方式時遇到問題。

*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已驗證)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM