c++ - 当全局函数需要指向 impl 的指针时,如何防止 impl 细节出现在头文件中?

标签 c++ oop encapsulation pimpl-idiom data-hiding

我正在使用 pimpl idiom在我的代码中有很多,主要是为了减少编译时间。

我遇到了调用 C 库的情况。我有一个 C++ 包装器类,它有它的接口(interface),血淋淋的细节都在 impl 中,当然:

class some_class {
public:
    void some_init();
    ...
private:
    class impl;
    std::unique_ptr<impl> m_pimpl;
}

在 cpp 文件中,我必须向 C 库注册一个回调,我可以在其中为它提供一个指针。我想将此函数调用转发给相应的成员函数。客户端(即此功能的用户)根本不必知道此细节:

static void from_c_func(void *ptr_to_class_impl) {
    static_cast<some_class::impl *>(ptr_to_class_impl)->from_c_func();
}

void some_class::some_init() {
    create_c_thing(static_cast<void *>(this->m_pimpl.get()), from_c_func);
}

问题是 some_class::impl 被声明为私有(private)的。我只能想到不完美的解决方案:

  1. 在头文件中公开class impl;。这并不理想,因为它确实应该是 private - 它恰好是非类函数需要看到它的实现细节。
  2. from_c_func 放在头文件中并friend 它。这并不理想,因为 some_class 的实现细节正在泄露。更改实现可能需要更改头文件,然后重新编译很多不需要重新编译的东西,这让我很不高兴。
  3. from_c_func 一个指向 some_class 本身的指针,然后调用 some_class 上的函数。这将需要将该函数放在头文件中,这又是一个实现细节 - 并且它必须是 public 无论如何,非友元函数才能调用它。

要做什么?到目前为止,我最好的选择似乎是 #1,但有没有更好的方法?

最佳答案

你可以在 impl 中移动你的函数

static void some_class::impl::from_c_func(void *ptr_to_class_impl) {
    static_cast<some_class::impl *>(ptr_to_class_impl)->from_c_func();
}

关于c++ - 当全局函数需要指向 impl 的指针时,如何防止 impl 细节出现在头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421700/

相关文章:

c++ - CMake:如何传递预处理器宏

java - 抽象方法与继承

c++ - Visual C++ 线程简单示例

c++ - 打印类型包括装饰、模板元编程、constexpr,用什么?

php - DDD 中实体之间的关系

oop - 属性依赖注入(inject)不违反封装原则吗?

引用外部对象的 Javascript 作用域

c++ - 在这种情况下如何保持良好的数据封装?

c++ - 在抽象基类中使用抽象类成员的最佳方式?

c++ - 从其他子类构造子类