2010-03-11 39 views
1

有两类:AB。有从A类型转换为B类型并返回的算法。我们无法触摸它们的源代码。我可以在两种类型之间编写隐式转换吗?第三方类型之间的隐式转换

实施例代码应工作:

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

隐式转换通常会造成更多的伤害,而不是好的,因为您不知道在查看代码时会发生什么。一个简单的错误分配可能会导致奇怪的行为。使用它们时应该非常小心。 – 2010-03-11 10:20:10

回答

2

不,我不认为所以。隐式转换通常使用重载运算符编码。它也适用于基本类型。由于您无法修改A和B代码,因此无法告诉编译器如何执行此操作。您的代码段会收到错误消息。

你必须做明确的转换。只是

return helper.convertToB(a); 

MY2C

+1

“隐式转换通常使用重载运算符进行编码。”或者使用隐式构造函数。我更喜欢后者,尽管我已经学会了避开任何隐式转换的难题。 – sbi 2010-03-11 10:25:22

+0

@sbi:我同意。我总是喜欢显式转换。啊,可读性和易维护性,为什么你这么低估... – neuro 2010-03-11 14:01:01

0

有两类:A和B有算法从A型转化成B型和背部。我们无法触摸它们的源代码。我可以在两种类型之间编写隐式转换吗?

不,如果AB不相关,则不能。 (而我对此表示感谢。隐式转换给够了苦头,因为他们是没有创造他们的第三方类的能力。)

2

没有,但你可以写一个名为free函数来做到这一点。然后

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); 
} 

这无疑是再清楚不过的隐式转换会。

0

即使无法更改A或B的实现,也可以将内联构造函数添加到B的定义中,该构造函数采用const A &。

我不过怀疑,除非类确实有密切的关系会更好,以提供一个明确的转换功能 - 隐式转换可能是一个巨大的难以发现的bug来源:

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

你会怎么做,而不触及A和B的源代码? – mukeshkumar 2010-03-11 10:46:37

+0

你不是在讨论修改第三方头文件吗?否则,你会得到一些不错的闪亮的二进制不兼容。 – Vlad 2010-03-11 12:09:55

+0

如果不更改该类的vtable(即不添加任何虚拟方法),则不应该得到任何二进制不兼容性。这不是一个好的解决方案,它是唯一的解决方案,如果(无论出于何种原因)您确实需要隐式转换。 正如我在回答的第二部分所说的,隐式转换通常是不好的 - 我的建议(正如其他人所说的)将是一种明确的转换方法或帮助器。 – Bids 2010-03-11 16:42:09