仅在实现中自动类型转换

时间:2014-03-31 23:22:15

标签: c++ oop type-conversion implicit-conversion

  1. 两个类:ProcessorData
  2. Data表示用户可以传递给Processor公共方法的一些数据对象。
  3. 在内部,Processor需要使用基于InternalData的{​​{1}}类型。
  4. 我将Data转换为Data并返回InternalData内的私有转换函数,以避免重复代码并本地化Processor接口有朝一日会发生变化所需的更改。 / LI>
  5. 但我希望这些转换隐含在Data而不是显式。
  6. 这些转化功能仅供Processor实施使用。
    不应该是外部世界可见或无法访问。
  7. Processor是一种库类型。我无法控制它,我也无法修改它的界面。
    也就是说,我不能只为它们添加转换构造函数或转换运算符成员函数。
    你可以认为它是内置类型如果你愿意的话。
  8. 我不想将这些转换器放在InternalData类中,因为它不是它的业务,它不应该知道Data将其转换为内部其他内容。
  9. 长话短说,我希望Processor的实现知道如何隐式地在ProcessorData之间进行类型转换,但除了{{1}之外没有其他人应该能够做到这一点,甚至知道它是在InternalData的实现中完成的。

    有没有办法在C ++中做到这一点?

    我尝试解决方案

    我的第一次尝试是在Processor内部转换构造函数和转换运算符,使它们成为Processor,并使Data成为private Processor friend能够访问这些私人转换器。但这比我想要的更多:它让Data 完全访问Processor的内部,这很糟糕。

    然后我注意到这一系列函数(转换器)一起形成Data接口,但是一个只应该用于Data的接口。所以我创建了一个抽象基类Processor并在那里声明了这些转换函数,如InternalDataConversions。我将此课程设为pure virtual friend。然后我让Processor类私下派生出来,并实现了这些转换器。这样Data可以在内部使用此“转化界面”,但它无法访问Processor内的任何其他内容,这样更好。
    但缺点是现在Data类需要在其定义中指定一些它不应该关注的东西,并且它不必要地使它依赖于DataInternalData,这是丑陋的。

    有更好的想法吗?

1 个答案:

答案 0 :(得分:0)

您可以在InternalData中提供转换成员函数。复制构造函数可以使用Data,转换运算符可以生成一个。

class InternalData
{
public:
    InternalData(const Data & data);
    operator Data() const;
};

据推测,InternalDataProcessor是私有的,所以这不会让界面变得混乱。