将类集枚举更改为非类集枚举

Posted

技术标签:

【中文标题】将类集枚举更改为非类集枚举【英文标题】:Changing Class-set Enum to Non Class-set Enum 【发布时间】:2013-07-07 20:34:34 【问题描述】:

我有错误:

error: cannot convert 'AudioEngine::input' from type 'mad_flow (AudioEngine::)(void*, mad_stream*)' to type 'mad_flow (*)(void*, mad_stream*)'

我有枚举,

enum mad_flow AudioEngine::input(void *data, mad_stream *stream)

    etc...

一个外部库正在调用它,

mad_decoder_init(&decoder, &player,
                 input, decode_header, decode_filter, process_output,
                 decode_error, 0 /* message */);

外部类需要输入,但我想保持我的引擎类为基础。我该怎么做?

非常感谢。

【问题讨论】:

您实际上是在问“我如何从 C 中调用成员函数?”? 可能。我真的不知道。 嗯,如果你真的不知道你在问什么,这将很难回答;)你能提供一些上下文(例如一些周围的代码)吗? madSdecoder_init 来自 libmad,它非常希望以自己的方式枚举 - 即枚举 mad_flow 输入(void data, mad_stream 流)。但是,枚举在我的类中使用了变量,所以我需要将它包装在类中。 好的,简单看一下documentation 会发现mad_decoder_init 期待一个回调(即一个函数指针),而不是一个enum. 【参考方案1】:

你应该让你的函数成为一个静态成员。您的类声明如下所示:

class AudioEngine

    ...    
    enum mad_flow input(void *data, mad_stream *stream);
    ...
;

你应该这样:

class AudioEngine

    ...    
    static enum mad_flow input(void *data, mad_stream *stream);
    ...
;

mad_decoder_init(...
                 &AudioEngine::input,
                 ...);

实际上,为了使 C++ 函数可以从 C 中调用,应该在类之外声明它,并在其前面加上 extern "C"

class AudioEngine

    ...    
    static enum mad_flow input(void *data, mad_stream *stream);
    ...
;

extern "C" enum mad_flow AudioEngine_input_callback(void *data, mad_stream *stream)

    return AudioEngine::input(data, stream);


mad_decoder_init(...
                 AudioEngine_input_callback,
                 ...);

但是,在实践中,第一个解决方案(只是在成员函数的声明前加上 static)会起作用。

【讨论】:

非常感谢。我现在正在查看是否可以修补 QAudioDecoder,但如果失败,我相信这肯定会有所帮助。不管怎样,我现在终于明白 extern "C" 是什么意思了!

以上是关于将类集枚举更改为非类集枚举的主要内容,如果未能解决你的问题,请参考以下文章

使用媒体查询中的类集作为更少的mixin

Java 类集初探

Java类集总结之一

第41节:Java当中的类集框架

25.类集框架

类集框架1