首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于隐藏实现的类型转换结构与pimpl-idiom

用于隐藏实现的类型转换结构与pimpl-idiom
EN

Stack Overflow用户
提问于 2011-08-01 07:58:15
回答 2查看 299关注 0票数 1

我知道pimpl的习惯用法,它在C中看起来像这样:

代码语言:javascript
复制
// foobar.h
struct FooBar {
    char *someString;
    struct FooBarImpl *pImpl;
};
// foobar.c
struct FooBarImpl {
    char *hiddenString;
};

然而,使用类型转换,我可以摆脱不透明的指针,并减少有人破坏实现的可能性:

代码语言:javascript
复制
// foobar.h
struct FooBar {
    char *someString
};
// foobar.c
struct FooBarImpl {
    // FooBar members
    char *someString
    // FooBarImpl members
    char *hiddenString
};

在后一种情况下,任何在FooBar上执行操作的函数都会简单地将类型转换为FooBarImpl,以获得对“私有”成员的访问。

例如,如果有人将一些成员添加到FooBar,而不是对FooBarImpl执行相同的操作,我可以看到这会成为一个问题。然而,在我的例子中,FooBar将只包含一个成员,并且不太可能发生变化。

当我想隐藏实现细节时,这是不是很好的做法,或者我应该坚持使用pimpl习惯用法?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-08-01 08:00:41

编译器是您的朋友;不要通过使用显式类型转换来欺骗它,特别是在复合类型之间。坚持使用第一种方法,如果你向前声明了实现结构,你就永远不会暴露它的内容。

票数 2
EN

Stack Overflow用户

发布于 2011-08-01 09:06:42

在处理在结构之间进行类型转换的代码时,您必须非常小心:

  1. 您不能创建FooBar数组,也不能将指向此类数组的指针提供给客户端code.
  2. Assigning或memcpy:ing结构(而不是它们的指针)将需要分配FooBarImpl,而不是FooBar -否则特定于实现的数据将被切断。
  3. 从头文件看,库的用户可能错误地认为使用memcpy或分配或创建FooBar结构是正确的-毕竟,它似乎包含的只是可以轻松填充的基本数据。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6893152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档