这段代码如何创建一个只有私有构造函数的类的实例?

时间:2011-07-07 07:46:18

标签: c++ private-constructor

我正在使用声音库(使用OpenAL),并从FMOD提供的界面中获取灵感,您可以看到界面at this link

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

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

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

感谢。

4 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:1)

他们永远不会创建任何实例!工厂功能就在标题

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

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

因为这是一个没有任何数据成员可以分辨出来的类吗?

答案 2 :(得分: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的自由函数,但这只会污染命名空间。

我担心我无法访问该链接,但另一种方式可能是工厂模式。我现在猜了一下。

答案 3 :(得分: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