5

我正在开发一个声音库(使用 OpenAL),并从 FMOD 提供的界面中获得灵感,您可以在此链接中看到该界面。

我提供了一些概念,例如:声音、通道和通道组,正如您通过 FMOD 接口看到的那样,所有这些类都有一个私有构造函数,例如,如果您要创建一个声音,您可以使用提供的函数createSound()通过 System 类(如果您要创建 Channel 或 ChannelGroup,则相同)。

我想提供一个类似的机制,但我不明白它是如何工作的。例如,函数createSound()如何创建一个新的声音实例?构造函数是私有的,并且在 Sound 接口中没有任何静态方法或友谊。是否使用了一些模式?

编辑:只是为了让 OP 的问题更清楚,他/她没有问如何使用私有构造函数创建类的实例,问题在发布的链接中,如何创建具有私有构造函数且没有静态方法或朋友的类的实例功能。

谢谢。

4

4 回答 4

7

没有看到源代码很难说。然而,似乎 FMOD 是 100% 的 C 语言,带有全局变量,并且周围有一个糟糕的“OOP”C++ 包装器。

鉴于没有源代码以及 .h 文件中播放的一些坏技巧,代码可能是使用不同的头文件编译的,然后恰好与编译器一起工作(即使它显然是非标准的)他们正在使用。

我的猜测是,C++ 包装器的真实(未发布)源代码正在定义一个静态方法,或者如果一切确实只是全局的,那么对象实际上并没有被创建,并且正在玩一些技巧来欺骗 C++ 对象系统认为有确实是一个对象。显然所有的调度都是静态的,所以这(虽然不是正式的合法)可以碰巧与我知道的 C++ 实现一起工作。

无论他们做了什么,从 C++ 的角度来看,它都是非常丑陋和不符合标准的。

于 2011-07-07T08:09:44.493 回答
1

他们从不创建任何实例!工厂函数就在标题中

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system)
{ return FMOD_System_Create((FMOD_SYSTEM **)system); }

您为获取 System 对象而传入的指针会立即转换为指向在 fmod.h 标头中声明的 C 结构的指针。

因为它是一个没有任何数据成员可以区分的类?

于 2011-07-07T09:06:53.480 回答
0
struct Foo {
    enum Type {
        ALPHA,
        BETA_X,
        BETA_Y
    };
    Type type () const;
    static Foo alpha (int i) {return Foo (ALPHA, i);}
    static Foo beta  (int i) {return Foo (i<0 ? BETA_X : BETA_Y, i);}
private:
    Foo (Type, int);
};

create_alpha 可能是一个声明的自由函数friend,但这只是污染了命名空间。

恐怕我无法访问该链接,但另一种方式可能是工厂模式。我现在有点猜。

于 2011-07-07T07:54:22.913 回答
0

这是工厂模式 - 正如他们的评论所说。

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); }

很难确切地说出发生了什么,因为他们没有公布该FMOD_System_Create方法的来源。

工厂模式是一种创建对象的机制,但生成的(子)类取决于工厂调用的参数。http://en.wikipedia.org/wiki/Factory_method_pattern

于 2011-07-07T08:06:23.827 回答