跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 由于找不到 C++版块,只能在这里问个类成员隐藏的问题。
未分類
28 12 月 2020

由于找不到 C++版块,只能在这里问个类成员隐藏的问题。

由于找不到 C++版块,只能在这里问个类成员隐藏的问题。

資深大佬 : James369 6

很喜欢 Objective-C 语言,特别是它的分类 Category 和扩展 Extension 的能力。现在有个项目是 C++的,碰到一个小需求,就是类实现中的某些方法,想弄成私有,并且不要在.h 头文件中声明(不声明还编译报错:prototype for ‘类名::函数名’does not match any in class’类名’)

简单的说,就是想彻底隐藏类中的某些方法(使其在头文件不可见)。这要是在 ObjectiveC 中用 Extension 分分钟就搞定了,而且代码也不冗余,C++不知道如何做?

大佬有話說 (17)

  • 資深大佬 : codehz

    (你可以把私有函数不做成方法*
    直接在 cpp 文件里做成普通 static 函数
    ,不要试图用两个不同的头文件,有 abi 问题

  • 資深大佬 : paoqi2048

    /go/cpp C++版块在这里

  • 主 資深大佬 : James369

    @codehz 也是个办法,算是曲线救国,要多传一个 对象指针进去。

  • 資深大佬 : Aspector

    用 pointer to implementation ?再写一个 impl 类不放头文件,用一个私有成员指针指过去。

  • 資深大佬 : zacharyjia

    抽一个父类出来做接口?对外只暴露父类,可能需要配合工厂模式食用?不过感觉比 1 的方法更复杂了

  • 資深大佬 : imkerberos

    impl 模式.

  • 資深大佬 : wutiantong

    十年前 obj-c 还没有 extension 时,我就用 impl 模式写过这种需求

  • 資深大佬 : enenaaa

    看看 qt 源码, 很多这样的写法。

  • 資深大佬 : geelaw

    不存在这种功能,C++ 里私有成员是接口而不是实现细节,这主要体现在字段影响内存布局、友元、可以被重写的私有虚拟成员、名字解析(私有成员会参与名字解析)。

    曲线救国的思路是 pimpl 或者接口化。

  • 資深大佬 : aneostart173

    外面只暴露接口,里面在 impl 一个类,或者只提供 c api 。

  • 資深大佬 : lakehylia

    纯虚函数接口配合 createInstance 和 releaseInstance,妥妥的

  • 資深大佬 : weidaizi

    //////////////////////////////
    // 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 即可

  • 資深大佬 : Wirbelwind

    .h 和.cc 分离 想要暴露函数的写在.h 里面
    不暴露的接口直接在.cc 里面写 第一个参数是这个类,其他不变
    class A{}

  • 資深大佬 : Wirbelwind

    https://godbolt.org/z/9817hs

  • 資深大佬 : weidaizi

    上面那个回复,忘记写 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 即可

  • 資深大佬 : jimmyismagic

    上面说得很清楚,暴露个父类出来,可以是纯虚类,也可以是模板类

  • 資深大佬 : Wirbelwind

    还有个使用 using 的办法
    不建议继承写法
    项目里面这样的写法多了之后 后期维护的人会头大 不简洁直观

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具