2012-04-19 55 views
2

我有一个基类分数和派生类iFraction。分数表示不正确的分数,i分数表示混合分数。基类和派生类的朋友函数

class Fraction {...}; 
class iFraction : public Fraction {...}; 

现在,我想声明这两个类的朋友函数,即convertF。函数convertF可以将不正确的分数(分数)转换为混合分数(iFraction)。 我这样做有多冷? 其实,我想声明函数是这样的:

friend iFraction convertF (Fraction &Fra); 

但是,它不能在基地CALSS分数内声明。为什么?

回答

2

由于friend关系不会被继承,所以您需要声明convertF作为这两个类的朋友。但是只有当函数需要访问这些类的内部时,你才需要它 - 你确定这些类的公共接口是不够的吗?

试图避免这种双重朋友的另一个原因是它会通过convertF的签名在这些类之间创建循环依赖关系。

更新:这正是为什么你不能以你上面显示的方式声明你的朋友功能。为此,编译器需要知道iFraction的完整定义,但仍未完成基类Fraction的定义,这是不可能的。

从技术上讲,它可以通过前向声明iFraction反过来工作。虽然我仍然不认为这是一个好的解决方案。你确定你的班级结构是正确的吗?

+0

感谢您的回答。现在,我明白为什么我不能这样做。但是,我怎么能实现我的目的,将分数转换成iFraction – user1305904 2012-04-19 12:30:13

+0

类Fraction有两个数据成员,一个用于分子,一个用于分母。类iFraction还有一个数据记忆iNum,它代表整数 – user1305904 2012-04-19 12:34:05

+0

@ user1305904的部分,在对术语进行双重检查之后,现在我确信您的继承关系不正确:混合部分不是**是不正确的部分。当然,两者之间的转换是完全明智的。 – 2012-04-19 13:01:14

2

你不需要这个朋友的功能。有两种方法可以使用dynamic_cast或编写一个转换构造函数,该构造函数接受Fraction对象并将其转换为iFraction对象。我不确定第二个选择是否是一个好选择,但是试试看。

+0

感谢您的回答。但是,我现在不知道什么是dynamic_cast。我只是一个新手。 – user1305904 2012-04-19 12:56:35

+0

@ user1305904 - http://stackoverflow.com/questions/2253168/dynamic-cast-in-c – DumbCoder 2012-04-19 13:00:34