使用面向对象的c库
use a c lib object orientated
本文关键字:面向对象的 更新时间:2023-10-16
我正在使用一个用C编写的库,它允许我读取和写入midi文件。虽然我发现了另一个用c++编写的库,但我仍然在努力解决这个问题:我怎么能把C库和对象/类一起使用呢?这个库有一个调用,它接受midi文件的路径,然后是针对特定midi事件类型调用的一些函数指针。所以它看起来像这样(abstract):
int main( int argc, char** args )
{
readMidi( args[ 1 ], onMidiEvent, onSysEvent, onError, ... );
}
我尝试使用一个指针指向一个类的实例来收集演奏的音符:
class MidiNoteList;
template < MidiNoteList* VMidi > onError( short errmsg, char* msg ) { ... }
...
int main( int argc, char** args )
{
MidiNoteList* m( new MidiNoteList( ) );
readMidi( args[ 1 ], onMidiEvent< m >, onSysEvent< m >, onError< m >, ... );
}
GCC规定m不能用作常量表达式。我知道m在编译时必须是常数,所以我知道为什么我不能这样做。但我如何用另一种方式解决这个"问题"呢?
通常这样的库使用一个额外的void *
参数,该参数传递给接受函数指针的函数,并传递给所有回调函数。如果你有,你可以用它来传递你的对象指针,将它强制转换为void,然后返回:
class MyObject;
void errCallback(void *m, short errcode, char *errmsg) {
static_cast<MyObject *>(m)->error(errcode, errmsg);
}
:
MyObject *m = new MyObject();
callLibrary(..., errCallback, m, ...);
如果库没有给你额外的参数,你就有问题了——在回调函数中获取额外数据的唯一方法是使用全局变量:
static MyObject *m;
void errCallback(short errcode, char *errmsg) {
m->error(errcode, errmsg);
}
:
m = new MyObject();
callLibrary(..., errCallback, ...);
这里的问题是,您需要为每个希望接收回调的不同对象声明一个新的回调函数(和全局变量)。如果您动态地创建了许多这样的对象,那么管理起来会变得很困难。
相关文章:
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 对"车辆的 vtable"的未定义引用 - 面向对象的编程练习
- 成员功能在面向对象的框架中返回std :: vector.size()的效率
- 以面向对象的方式解析自定义数据包
- 面向对象的编程-C 练习
- 如何使用面向对象的技术在 win32 和 c++ 中创建编辑控件
- C++面向对象的字典程序
- 我在哪里可以找到一些 c++ 中的好例子来研究面向对象的概念
- 面向对象的设计选择
- 我应该移至面向对象的编程(黑匣子)以及如何
- 面向对象的图层
- 创建面向对象的链表时出现编译问题(编译器错误C2664)
- 面向对象的数据设计
- 我试图通过我的方案实现的面向对象的想法是什么?
- 是否所有面向对象的语言都会在内存中创建大量重复信息
- C++ 面向对象的编程异常失败
- C++面向对象的客户端套接字应用程序设计
- 面向对象的编程逻辑
- C++基类中虚函数的面向对象的返回值
- C++面向对象的问题