2011-07-07 36 views
5

我正在开发一个声音库(使用OpenAL),并从FMOD提供的界面中获取灵感,您可以看到界面at this link这段代码如何创建一个只有一个私有构造函数的类的实例?

我已经提供了一些概念,例如:Sound,Channel和ChannelGroup,正如您通过FMOD接口所看到的,所有这些类都有一个私有构造函数,例如,如果要创建一个声音, createSound()由System类提供(如果要创建Channel或ChannelGroup,则相同)。

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

编辑:只是为了让OP的问题清楚,s /他没有问如何创建一个类的实例与私人构造函数,问题是在链接张贴,如何创建类的实例具有私人构造函数和没有静态方法或朋友功能。

谢谢。

+0

有tou尝试使用朋友成员 – zabulus

+0

该界面看起来相当差。一般来说,“系统”或“神”类被称为反模式。 – MSalters

+0

它是否创建了一个具有公共或朋友构造函数并返回它的子类的实例? – jcoder

回答

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免费的功能,但是这只是污染的命名空间。

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

+4

在OP发布的那些接口中没有'静态方法'。 –

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

+1

工厂仍然需要能够访问CTOR,虽然... – Dennis

7

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

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

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

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

+1

+1是唯一一个阅读问题的答复者。为了正确 - 没有标准兼容的方式来做到这一点。 – interjay

+0

很明显,我认为更好的工作是重新思考我的界面。 – enigma

1

他们从不创建任何实例!工厂功能是正确的,在头

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

你传递来获取系统对象的指针立即转换为指针,以在fmod.h头部声明C结构。

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

+0

你的意思是他们调用一个C函数将地址传递到存储指针的地方(但是这个函数实际做了什么没有显示)。我不确定真正的C对象确实没有数据成员,因为考虑到在这里使用不可移植的非标准欺骗的水平,我不会感到惊讶的是,库确实是使用不同的头文件进行编译的,并且可见头文件确实只是为图书馆用户。 – 6502

相关问题