通过前向声明隐藏实现

Hiding implementation by forward declaration

我有一个 class,我们称它为 Product,我想对用户完全隐藏它的实现。不过,我希望用户收集产品,传递它们,一般来说,决定如何处理它们,而不知道里面是什么。

我想到的第一个想法是简单地创建一个 ProductFactory class 并在 ProductFactory.h header.[=18= 中转发声明 Product class ] Product class 的 object 将由 makeProduct 方法创建,该方法将 return 指向 Product class 的共享指针。用户将无法看到里面的内容,但它可以将其发送到服务 class,在其实现中将包含 Product 的完整定义,以便它可以访问它的内容。
您认为这是个好主意还是更像是一种解决方法?

我也在考虑使用 pimpl idiom,以防我需要一些用户可以访问的 top-level 功能,例如 operator== 以便用户可以检查产品是否相同。

请注意,抽象基础 class 不是一个选项,因为没有真正的接口可以同时满足用户和服务 class 的需求例子。

如果shared_ptr给你的操作对用户来说已经足够了(例如应该有一个运算符==),那么这个解决方案应该是一个可行的方法。

如果您需要的不止这些,那么 pimpl 听起来是个好方法,因为您可以在 class 中定义用户需要的操作,并在 class 中定义您的服务 class 需要的操作暗示。您仍然可以在这里使用智能指针,让生活更轻松。