c++ - 如何将值设置为头文件中声明的指针
问题描述
我的项目中名为 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();
^
解决方案
您似乎无法理解指针的工作原理。
*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已验证)。
推荐阅读
- razor - 如何在 Asp.Net Core 的 Razor 类库中使用本地化
- rust - 如何指定使用 if let 时无法推断的类型?
- javascript - 了解幻想世界`ap`
- c# - 使用某种任务调度或多线程将 Word 自动化应用程序转换为具有多个线程
- node.js - 序列化失败(grpc/node)
- cluster-computing - 如何用 3 个节点做 VerneMQ 集群?
- reactjs - 无法在 antd 表上显示来自 API 的 JSON 数据
- c# - JSON > C# 类(仅限特定类)
- python - Python - 为什么 unicode 不会死?
- testing - 如何随机化 Cucumber 的步骤顺序?