我知道pimpl的习惯用法,它在C中看起来像这样:
// foobar.h
struct FooBar {
char *someString;
struct FooBarImpl *pImpl;
};
// foobar.c
struct FooBarImpl {
char *hiddenString;
};然而,使用类型转换,我可以摆脱不透明的指针,并减少有人破坏实现的可能性:
// foobar.h
struct FooBar {
char *someString
};
// foobar.c
struct FooBarImpl {
// FooBar members
char *someString
// FooBarImpl members
char *hiddenString
};在后一种情况下,任何在FooBar上执行操作的函数都会简单地将类型转换为FooBarImpl,以获得对“私有”成员的访问。
例如,如果有人将一些成员添加到FooBar,而不是对FooBarImpl执行相同的操作,我可以看到这会成为一个问题。然而,在我的例子中,FooBar将只包含一个成员,并且不太可能发生变化。
当我想隐藏实现细节时,这是不是很好的做法,或者我应该坚持使用pimpl习惯用法?
谢谢。
发布于 2011-08-01 08:00:41
编译器是您的朋友;不要通过使用显式类型转换来欺骗它,特别是在复合类型之间。坚持使用第一种方法,如果你向前声明了实现结构,你就永远不会暴露它的内容。
发布于 2011-08-01 09:06:42
在处理在结构之间进行类型转换的代码时,您必须非常小心:
https://stackoverflow.com/questions/6893152
复制相似问题