代码之家  ›  专栏  ›  技术社区  ›  Notinlist

第三方类型之间的隐式转换

  •  1
  • Notinlist  · 技术社区  · 14 年前

    有两类: A B .有从类型转换的算法 收件人类型 然后回来。我们不能触摸它们的源代码。我可以在这两种类型之间写一个隐式转换吗?

    应起作用的示例代码:

    B CalculateSomething(double x)
    {
        A a(x);
        a.DoSomethingComplicated();
        return a;
    }
    
    5 回复  |  直到 9 年前
        1
  •  2
  •   neuro    14 年前

    不,我不这么认为。隐式转换通常使用重载运算符进行编码。它也适用于基类型。因为你不能修改A和B代码,所以没有办法告诉编译器怎么做。您的代码段将出错。

    您必须进行显式转换。只是

    return helper.convertToB(a);
    

    MY2C

        2
  •  2
  •   anon    14 年前

    不,但是您可以编写一个命名的自由函数来完成它。

    B ToB( const A & a ) {
       B b;
       // process a somehow to add its data  to b
       return b;
    }
    

    然后您的代码变为:

    B CalculateSomething(double x)
    {
        A a(x);
        a.DoSomethingComplicated();
        return ToB( a );
    }
    

    这可以说比隐式转换更清楚。

        3
  •  0
  •   sbi    14 年前

    有两个类:A和B。有从A型转换到B型和从B型转换回来的算法。我们不能触摸它们的源代码。我可以在这两种类型之间写一个隐式转换吗?

    不,如果 A B 没有关系,你不能(我很感激)。隐式转换会带来足够的麻烦,因为它们无法为第三方类创建它们。)

        4
  •  0
  •   mukeshkumar    14 年前

    不改变类定义是不可能的

        5
  •  0
  •   Bids    14 年前

    即使不能更改a或b的实现,也可以向b的定义中添加一个采用const a&的内联构造函数。

    然而,我怀疑,除非类确实是密切相关的,否则最好提供一个显式转换函数-隐式转换可能是很难发现错误的巨大来源:

    B CalculateSomething(double x)
    {
        A a(x);
        a.DoSomethingComplicated();
        return ConvertAToB( a );
    }