gpt4 book ai didi

c++ - 非静态成员函数的无效使用

转载 作者:行者123 更新时间:2023-11-28 01:24:33 25 4
gpt4 key购买 nike

在我的 Qt 应用程序中,我希望能够向非静态 QTabWidget 添加一个选项卡。当用户按下快捷方式时。通常我会这样实现它:

File.addAction("Settings", openSettings, Qt::ALT + Qt::Key_S);

哪里FileQTabWidgetopenSettings是一个静态方法。唯一的问题是它只适用于静态方法,问题是我无法在静态方法中访问非静态变量。因此,我认为由于 Qt 要求该函数是静态函数,所以我可以实例化一个静态的 std::function<>。对象本身:

static std::function<void(void)> openSettings_ = []() { openSettings; };

并这样调用它

File.addAction("Settings", openSettings_, Qt::ALT + Qt::Key_S);

问题在于它会产生错误:

Error: invalid use of non-static member function 'void window::openSettings()'

我这样做的原因是我熟悉 C 并假设 Qt 所谓的仿函数几乎与函数指针相同,后者几乎是一个对象。因此,我假设如果我要实例化一个 std::function 类型的静态对象指向/执行了一个非静态函数我会解决这个问题,但显然不是这样。鉴于我当前的思维过程是错误的,我将如何着手去做?

最佳答案

首先,立即出现错误是因为您实际上并未调用该函数。您必须调用它:openSettings();

但是,这是行不通的。 openSettings 是非静态成员函数。所有此类普通成员函数都采用隐式 this 指针,指向调用它们的对象。这意味着如果没有调用它的对象,就不能直接调用 openSettings 函数。但是 this 没有被您编写的 lambda 捕获,这意味着没有这样的对象。

这可以通过在 lambda 中捕获 this 来解决,例如 auto openSettings_ = [this]() { this->openSettings(); ;

但另一方面,这个函数就像一个插槽。您应该使用标准信号/槽语法将您感兴趣的信号直接附加到信号上,而不是编写单独的仿函数。应该是这样的。

File.addAction("Settings", this, &(decltype(*this))::openSettings, Qt::ALT + Qt::Key_S);

(请注意,我使用的是 decltype,因为我不确定 *this 是什么类型。您可以用类名替换。)

关于c++ - 非静态成员函数的无效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54546054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com