回调问题错误:非静态数据成员的使用无效

Posted

技术标签:

【中文标题】回调问题错误:非静态数据成员的使用无效【英文标题】:Callback issues error: invalid use of non-static data member 【发布时间】:2018-11-19 23:10:59 【问题描述】:

编辑:更新干净的可重现示例。

我是 C++ 的初学者,有几年的 C 经验,所以如果我以错误的方式处理这个问题,我深表歉意。我试图将问题分解为尽可能小的代码示例。在我的代码中,我继承了一个 C 回调函数,在其中我想从类成员触发另一个回调。

我有两个问题:

a) 我在 Callback 中没有 Range 的实例,并且回调没有 void * 参数供我使用。

b) 我收到一条错误消息

错误:非静态数据成员“Range::cbk”的使用无效

我刚刚开始学习 C++ 和 OOP 的规则,如果我做的事情存在根本性的缺陷,我深表歉意。

#include <iostream>
#include <functional>

class Range

public:
  typedef std::function<void()> TCallback;
  TCallback cbk;

  Range()
  
    cbk = std::bind(&Range::RunTest, this);
  

  void Close() 

  ~Range()  Close(); 

  void RunTest()
  
        std::cout << "RunningTest\n";
  
;

static void Callback(bool ev)

  if (ev)
    Range::cbk();



int main()

  std::function<void(bool)> test;
    Range r1;
  test = std::bind(Callback, 1);
  test(1);

  return 0;

【问题讨论】:

你的minimal reproducible example在哪里? 请提供minimal reproducible example。目前,很难理解您的问题可能是什么。您尝试调用方法的问题是静态方法吗?如果您从TestOne 之外调用它,它会被标记为private,并且是非静态的。 @LightnessRacesinOrbit 已更新以将问题分解为尽可能小的示例。 @AlgirdasPreidžius 已更新以将问题分解为尽可能小的示例 不清楚你在问什么或你想做什么。 【参考方案1】:

没有实例就不能调用成员函数。

你在 Range 构造函数中做对了;你在mainCallback 做错了。

static void Callback(Range* ptr, bool ev)

  if (ev)
    ptr->cbk();

还有:

test = std::bind(Callback, &r1, 1);
//                       ^^^^^

如果你不能改变Callback,那么你想做的事情根本不可能。你必须有一些 global Range 指针,但这真的很重要。归根结底,这就是发明类的原因,但如果您因为卡在一个非常扁平的 C API 中而无法使用它们,那么您只需要像在 C 中一样破解它。

【讨论】:

非常感谢您的意见;是的,这正是我无法更改回调声明的问题。即使我需要一个用于多个实例的全局指针数组,我也可能会沿着全局指针路线走下去。如此丑陋,这似乎是我唯一的选择。 @tech1990 差不多。顺便说一句,回调设计得很糟糕,因为知道这总是一个问题,人们倾向于至少在其中粘贴 void* 以传递信息。

以上是关于回调问题错误:非静态数据成员的使用无效的主要内容,如果未能解决你的问题,请参考以下文章

错误:非静态成员函数 C++ 的无效使用

| 9 |错误:无效使用非静态数据成员'Matrix :: row'| 9 |错误:数组绑定不是']'令牌之前的整数常量|

访问父类的成员“非静态数据成员的使用无效”C++

使用boost bind时无效使用非静态成员函数 - c ++

使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?

在 Qt 中无效使用非静态数据成员 Ui_Mainwindow::(Pushbutton)