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

eni*_*gma 5 c++ private-constructor

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

我已经提供了一些概念,如:声音,通道和通道组,你可以通过FMOD界面上看到,所有这些类都有一个私有的构造方法,例如,如果你想创建一个声音,你肥大使用功能createSound()提供由System类(如果您要创建Channel或ChannelGroup,则相同).

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

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

谢谢.

650*_*502 7

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

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

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

无论他们做了什么,从C++的角度来看,它都非常难看并且不符合要求.


spr*_*aff 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);
};
Run Code Online (Sandbox Code Playgroud)

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

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

  • OP 发布的那些接口中没有“静态方法”。 (4认同)