![]() | 1 codehz 2020-12-16 15:12:44 +08:00 ![]() (你可以把私有函数不做成方法* 直接在 cpp 文件里做成普通 static 函数 ,不要试图用两个不同的头文件,有 abi 问题 |
![]() | 4 Aspector 2020-12-16 15:20:06 +08:00 用 pointer to implementation ?再写一个 impl 类不放头文件,用一个私有成员指针指过去。 |
5 unifier 2020-12-16 15:24:23 +08:00 抽一个父类出来做接口?对外只暴露父类,可能需要配合工厂模式食用?不过感觉比 1 楼的方法更复杂了 |
6 imkerberos 2020-12-16 15:27:12 +08:00 impl 模式. |
![]() | 7 wutiantong 2020-12-16 15:47:17 +08:00 十年前 obj-c 还没有 extension 时,我就用 impl 模式写过这种需求 |
![]() | 8 enenaaa 2020-12-16 15:49:16 +08:00 看看 qt 源码, 很多这样的写法。 |
![]() | 9 geelaw 2020-12-16 15:52:27 +08:00 via iPhone 不存在这种功能,C++ 里私有成员是接口而不是实现细节,这主要体现在字段影响内存布局、友元、可以被重写的私有虚拟成员、名字解析(私有成员会参与名字解析)。 曲线救国的思路是 pimpl 或者接口化。 |
10 aneostart173 2020-12-16 16:13:55 +08:00 外面只暴露接口,里面在 impl 一个类,或者只提供 c api 。 |
![]() | 11 lakehylia 2020-12-16 16:19:53 +08:00 纯虚函数接口配合 createInstance 和 releaseInstance,妥妥的 |
![]() | 12 weidaizi 2020-12-16 16:23:06 +08:00 ////////////////////////////// // 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 即可 |
13 Wirbelwind 2020-12-16 16:48:18 +08:00 |
14 Wirbelwind 2020-12-16 16:50:43 +08:00 ![]() |
![]() | 15 weidaizi 2020-12-16 16:52:59 +08:00 上面那个回复,忘记写 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 即可 |
16 jimmyismagic 2020-12-16 16:56:37 +08:00 上面说得很清楚,暴露个父类出来,可以是纯虚类,也可以是模板类 |
17 Wirbelwind 2020-12-16 17:03:28 +08:00 还有个使用 using 的办法 不建议继承写法 项目里面这样的写法多了之后 后期维护的人会头大 不简洁直观 |