假设我有如下内容:
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.cpp 将无法编译,因为“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/