有两类:A
和B
。有从A
类型转换为B
类型并返回的算法。我们无法触摸它们的源代码。我可以在两种类型之间编写隐式转换吗?第三方类型之间的隐式转换
实施例代码应工作:
B CalculateSomething(double x)
{
A a(x);
a.DoSomethingComplicated();
return a;
}
有两类:A
和B
。有从A
类型转换为B
类型并返回的算法。我们无法触摸它们的源代码。我可以在两种类型之间编写隐式转换吗?第三方类型之间的隐式转换
实施例代码应工作:
B CalculateSomething(double x)
{
A a(x);
a.DoSomethingComplicated();
return a;
}
有两类:A和B有算法从A型转化成B型和背部。我们无法触摸它们的源代码。我可以在两种类型之间编写隐式转换吗?
不,如果A
和B
不相关,则不能。 (而我对此表示感谢。隐式转换给够了苦头,因为他们是没有创造他们的第三方类的能力。)
不可能不改变类的定义
没有,但你可以写一个名为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);
}
这无疑是再清楚不过的隐式转换会。
即使无法更改A或B的实现,也可以将内联构造函数添加到B的定义中,该构造函数采用const A &。
我不过怀疑,除非类确实有密切的关系会更好,以提供一个明确的转换功能 - 隐式转换可能是一个巨大的难以发现的bug来源:
B CalculateSomething(double x)
{
A a(x);
a.DoSomethingComplicated();
return ConvertAToB(a);
}
你会怎么做,而不触及A和B的源代码? – mukeshkumar 2010-03-11 10:46:37
你不是在讨论修改第三方头文件吗?否则,你会得到一些不错的闪亮的二进制不兼容。 – Vlad 2010-03-11 12:09:55
如果不更改该类的vtable(即不添加任何虚拟方法),则不应该得到任何二进制不兼容性。这不是一个好的解决方案,它是唯一的解决方案,如果(无论出于何种原因)您确实需要隐式转换。 正如我在回答的第二部分所说的,隐式转换通常是不好的 - 我的建议(正如其他人所说的)将是一种明确的转换方法或帮助器。 – Bids 2010-03-11 16:42:09
隐式转换通常会造成更多的伤害,而不是好的,因为您不知道在查看代码时会发生什么。一个简单的错误分配可能会导致奇怪的行为。使用它们时应该非常小心。 – 2010-03-11 10:20:10