c++ - 关于带有签名 void *data 的参数的非常基本的问题

标签 c++ pointers

这很可能是一个非常基本的问题 - 对此感到抱歉。

我用 C++ 编写了一个由 C 引擎提供支持的接口(interface)。其中一个 C 引擎函数具有以下签名:

static int f(double t, double *y, double *ydot, void *data)

*data 是将用户数据传递给 ODE 求解器。现在,在 C 中,我将简单地创建一个 struct,用我的数据初始化它,然后传递它。在 C++ 中,我想创建一个包含用户数据的类,并像我之前传递 struct 一样传递它。这是可以做到的,因为 structsclasses

但是,当我尝试这样做时,会发生以下情况:

int.cpp:25: error: no matching function for call to ‘UserData::UserData()’
int.cpp:13: note: candidates are: UserData::UserData(double)
int.cpp:5: note:                 UserData::UserData(const UserData&)
int.cpp:28: error: ‘void*’ is not a pointer-to-object type
int.cpp:29: error: ‘void*’ is not a pointer-to-object type

我的问题如下:

  1. void *data 表示法是什么意思?
  2. 为什么提示我没有具有适当签名的构造函数?

显然我是一个菜鸟,所以如果这很明显我很抱歉,但我什至不知道用什么术语来谷歌这个问题(除了谷歌搜索错误本身)。

谢谢!

编辑:

对于上一个问题的含糊不清,我深表歉意。另外,我解决了这个问题,这是一个非常愚蠢的错误。

我有一个包含参数的类:

class Data{
// an interface to get parameters
};

我需要用签名调用一个 C 函数

static int f(double t, ...., void *user_data)

我错误地这样做了:

static int f(double t, ...., void *user_data){
 Data *data = (Data*) data; /* this is the stupid mistake */
}

当我打算这样做时(现在可以了):

static int f(double t, ...., void *user_data){
 Data *data = (Data*) user_data; /* this is the correction  */
}

谢谢大家 - 我感谢指出 void *data 的正确含义。

最佳答案

void *data 

表示指向任何地址的指针。这是一种传递任意类型数据的非类型安全方式。在 C 语言中,实现用 function object 完成的操作是一种常见的模式。在 C++ 中。您的 ODE 求解器实际上可能并未使用数据参数,而是由您提供的回调使用。您和回调需要知道数据指向什么,ODE 求解器不需要。求解器只是将地址传递给回调函数。

举个简单的例子,假设库有一个函数可以在单个变量中找到函数的根

  typedef double (*valuation_function) (double x, void * params);
  double find_root(valuation_function fn, double lower, double upper, void* params);

params 函数使您能够编写参数化函数。假设您想找到一条线的根。

struct Line {
  double slope;
  double intercept;
  public:
     Line(double s, double i) : slope(s), intercept(i) {}
};

double a_line(double x, void *params) {
  Line* line = (Line *)params;
  return line->slope * x + line->intercept;
}

然后您可以为任何行调用函数 find_root。 第 45 行(1.0,0.0); find_root(a_line, fortyFive);

更多的可以看gsl库examples .

关于c++ - 关于带有签名 void *data 的参数的非常基本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7590610/

相关文章:

C++:打印或计算一个标准库容器到控制台

C++类设计

c - c代码中指向函数的指针

c++ - 使用指向 QObject 的原始指针作为信号参数是否安全?

ios - 使用指针的简单函数会导致内存错误

c++ - 如何在 C++ 中将 Foo** 指针转换为 const Foo**

c++ - 从 C 使用 C++ 损坏的函数

c++ - 有人可以帮我把这个 c++ 代码翻译成 c 吗?

c++ - 在 C++ 中的循环中正确删除动态分配的对象的位置

c - 链表中指针的操作