c++ - 如何从类定义中省略私有(private)非虚拟方法?

标签 c++ c++11 private forward-declaration pimpl-idiom

假设我有如下内容:

a.hpp:

class B;

class A
{
private:
  std::unique_ptr<B> b_;
}

a.cpp:

#include <something_complicated.hpp>

struct B
{
  something_complicated x;
}

something_complicated& A::get_complicated() { return b_->x; }

不幸的是,在这种情况下,a.cp​​p 将无法编译,因为“get_complicated()”不是 A 的方法。

所以,我们可以试试这个:

a.hpp:

class B;

class A
{
private:
  std::unique_ptr<B> b_;
  something_complicated& A::get_complicated();
}

但是 a.hpp 无法编译,因为 some_complicated 未定义。

如果它是一个类,我们可以转发声明 some_complicated,但它可能是一个 typedef,所以这是不可能的。

我能想到的唯一方法是在不公开 b_ 也不在 a.hpp 中包含 Something_complicated.hpp 的情况下执行此操作:

a.cpp:

#include <something_complicated.hpp>

struct B
{
  something_complicated x;
}

#define get_complicated ((b_->x))

我当然不必定义宏来解决这个问题吗?还有其他选择吗?

最佳答案

最简单的解决方案可能是将复杂类型的引用包装在类中,在 a.hpp 中向前声明,然后在 something_complicated.hpp 中定义它。

a.hpp:

class B;
class complicated_ref;

class A
{
public:
  complicated_ref get_complicated();
private:
  std::unique_ptr<B> b_;
};

something_complicated.hpp:

// ... complicated definitions ...
typedef whatever something_complicated;

struct complicated_ref
{
    complicated_ref(something_complicated & thing) : ref(thing) {}
    something_complicated & ref;
};

现在a.cpp以及任何需要使用复杂类型的东西都必须包含它的 header ,但任何只想使用class A的东西都不需要。

这是假设 A 的某些客户端有充分理由访问复杂的事物,但每个人都无法访问 B。在需要时允许访问 B 并通过它处理复杂的事情会更简单。

关于c++ - 如何从类定义中省略私有(private)非虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5538165/

相关文章:

c++ - 使用 std::sort 根据数据类型中包含的整数值对混合数据类型 vector 进行排序有多安全?

java - 我怎样才能将我的私有(private)整数放入公共(public)整数中

当涉及 std::function 或 lambda 函数时,C++11 不推导类型

java - 如何从私有(private)方法调用数组?

java - 为什么在方法中看不到 "private static"?

c++ - 线程对象可以在C++ 11中 move 吗?

c++ - 如何为 Windows 应用程序创建可移动/可调整大小/可配置的工具栏

c++ - 有谁知道我在哪里可以找到标准的 Windows 文件对话框工具栏图标?

c++ - 无法正确 memcpy 一个 char 数组来构造

c++ - L 和 R 引用变量