Processor
和Data
。Data
表示用户可以传递给Processor
公共方法的一些数据对象。Processor
需要使用基于InternalData
的{{1}}类型。Data
转换为Data
并返回InternalData
内的私有转换函数,以避免重复代码并本地化Processor
接口有朝一日会发生变化所需的更改。 / LI>
Data
而不是显式。Processor
实施使用。Processor
是一种库类型。我无法控制它,我也无法修改它的界面。InternalData
类中,因为它不是它的业务,它不应该知道Data
将其转换为内部其他内容。长话短说,我希望Processor
的实现知道如何隐式地在Processor
和Data
之间进行类型转换,但除了{{1}之外没有其他人应该能够做到这一点,甚至知道它是在InternalData
的实现中完成的。
有没有办法在C ++中做到这一点?
我尝试解决方案
我的第一次尝试是在Processor
内部转换构造函数和转换运算符,使它们成为Processor
,并使Data
成为private
Processor
friend
能够访问这些私人转换器。但这比我想要的更多:它让Data
完全访问Processor
的内部,这很糟糕。
然后我注意到这一系列函数(转换器)一起形成Data
的接口,但是一个只应该用于Data
的接口。所以我创建了一个抽象基类Processor
并在那里声明了这些转换函数,如InternalDataConversions
。我将此课程设为pure virtual
friend
。然后我让Processor
类私下派生出来,并实现了这些转换器。这样Data
可以在内部使用此“转化界面”,但它无法访问Processor
内的任何其他内容,这样更好。
但缺点是现在Data
类需要在其定义中指定一些它不应该关注的东西,并且它不必要地使它依赖于Data
和InternalData
,这是丑陋的。
有更好的想法吗?
答案 0 :(得分:0)
您可以在InternalData
中提供转换成员函数。复制构造函数可以使用Data
,转换运算符可以生成一个。
class InternalData
{
public:
InternalData(const Data & data);
operator Data() const;
};
据推测,InternalData
对Processor
是私有的,所以这不会让界面变得混乱。