我的项目中名为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)已验证)。