This topic created in 1979 days ago, the information mentioned may be changed or developed.
很喜欢 Objective-C 语言,特别是它的分类 Category 和扩展 Extension 的能力。现在有个项目是 C++的,碰到一个小需求,就是类实现中的某些方法,想弄成私有,并且不要在.h 头文件中声明(不声明还编译报错:prototype for '类名::函数名'does not match any in class'类名')
简单的说,就是想彻底隐藏类中的某些方法(使其在头文件不可见)。这要是在 ObjectiveC 中用 Extension 分分钟就搞定了,而且代码也不冗余,C++不知道如何做?
17 replies  | | 1 codehz Dec 16, 2020 1 (你可以把私有函数不做成方法* 直接在 cpp 文件里做成普通 static 函数 ,不要试图用两个不同的头文件,有 abi 问题 |
 | | 4 Aspector Dec 16, 2020 用 pointer to implementation ?再写一个 impl 类不放头文件,用一个私有成员指针指过去。 |
 | | 5 unifier Dec 16, 2020 抽一个父类出来做接口?对外只暴露父类,可能需要配合工厂模式食用?不过感觉比 1 楼的方法更复杂了 |
 | | 7 wutiantong Dec 16, 2020 十年前 obj-c 还没有 extension 时,我就用 impl 模式写过这种需求 |
 | | 8 enenaaa Dec 16, 2020 看看 qt 源码, 很多这样的写法。 |
 | | 9 geelaw Dec 16, 2020 via iPhone 不存在这种功能,C++ 里私有成员是接口而不是实现细节,这主要体现在字段影响内存布局、友元、可以被重写的私有虚拟成员、名字解析(私有成员会参与名字解析)。
曲线救国的思路是 pimpl 或者接口化。 |
 | | 10 aneostart173 Dec 16, 2020 外面只暴露接口,里面在 impl 一个类,或者只提供 c api 。 |
 | | 11 lakehylia Dec 16, 2020 纯虚函数接口配合 createInstance 和 releaseInstance,妥妥的 |
 | | 12 weidaizi Dec 16, 2020 ////////////////////////////// // foo.h class Foo { public: static Foo* newFoo();
void Bar(); }
-----------------------------------------------------------
////////////////////////////// // foo_impl.h #include "foo.h"
class FooImpl : public Foo { public: void Bar();
private: void Xyz(); };
-----------------------------------------------------------
然后对外只暴露 foo.h 即可 |
 | | 15 weidaizi Dec 16, 2020 上面那个回复,忘记写 virtual 了,
////////////////////////////// // foo.h class Foo { public: static Foo* newFoo();
virtual void Bar(); }
-----------------------------------------------------------
////////////////////////////// // foo_impl.h #include "foo.h"
class FooImpl : public Foo { public: virtual void Bar() override;
private: void Xyz();
private: ....... };
-----------------------------------------------------------
然后对外只暴露 foo.h 即可 |
 | | 17 Wirbelwind Dec 16, 2020 还有个使用 using 的办法 不建议继承写法 项目里面这样的写法多了之后 后期维护的人会头大 不简洁直观 |