![](/img/trans.png)
[英]Using a pointer to a structure in a function that is declared in a header file
[英]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.