2

我有一个基类 Fraction 和一个派生类 iFraction。Fraction 代表假分数,iFraction 代表混合分数。

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

现在,我要声明这两个类的友元函数,即convertF。函数 convertF 可以将假分数(Fraction)转换为混合分数(iFraction)。我这样做有多冷?实际上,我想像这样声明函数:

friend iFraction convertF (Fraction &Fra);

但是,它不能在基本类 Fraction 中声明。为什么?

4

3 回答 3

2

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

试图避免这种双重朋友的另一个原因是它会通过convertF.

更新:这就是为什么你不能像上面显示的那样声明你的朋友函数的原因。为此,编译器需要知道 while 的完整定义,iFraction而它还没有完成基类的定义Fraction,这是不可能的。

从技术上讲,它可以通过向前声明iFraction. 尽管我仍然认为它不是一个好的解决方案。你确定你的类层次结构是正确的吗?

于 2012-04-19T12:16:48.820 回答
2

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

于 2012-04-19T12:17:01.963 回答
0

阅读:http ://www.cprogramming.com/tutorial/friends.html

始终尝试首先理解这个概念。

于 2012-04-19T12:20:45.637 回答