2012-04-19 23 views
2

私は基本クラスFractionと派生クラスiFractionを持っています。 Fractionは不適当な分数を表し、iFractionは混合分数を表します。基本クラスと派生クラスのフレンド関数

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

ここで、これら2つのクラスのfriend関数、つまりconvertFを宣言したいと思います。関数convertFは不適切な分数(Fraction)を混合分数(iFraction)に変換することができます。 どのように寒いですか? 実は、私はこのような関数を宣言したいと思います:

friend iFraction convertF (Fraction &Fra); 

しかし、それは基本calss画分内で宣言することはできません。どうして?

答えて

2

friendの関係は継承されないため、convertFを両方のクラスのフレンドとして宣言する必要があります。しかし、関数がこれらのクラスの内部にアクセスする必要がある場合にのみ必要です。クラスのパブリック・インタフェースでは十分ではありませんか?

このような二重の友人を避けようとするもう一つの理由は、署名がconvertFであり、これらのクラス間の循環依存性が生じるということです。

更新:これはまさにあなたが上記の方法であなたの友人機能を宣言することができない理由です。これが機能するためには、基本クラスFractionの定義でまだ完了していない間に、コンパイラはiFractionの完全な定義を知る必要がありますが、これは不可能です。

技術的には、逆方向に動作する可能性があります。iFractionと宣言します。私はまだそれを良い解決策とは考えていませんが。あなたのクラス階層は正しいですか?

+0

あなたの答えをありがとう。今、なぜ私はこれを行うことができないのか理解しています。しかし、FractionをiFraction – user1305904

+0

に変換する目的を実現するには、Fractionクラスに分子と分母の2つのデータメンバーがあります。クラスiFractionには、整数 – user1305904

+0

@ user1305904の部分を表すデータメンバiNumがもう1つあります。条件を二重チェックした後、継承関係が正しくないと確信しています。混合分数は不適切な分数ではありません。もちろん、2つの間の変換は完全に賢明です。 –

2

これにはフレンド機能は必要ありません。これを行うには、dynamic_castを使用する方法と、Fractionオブジェクトを取得してiFractionオブジェクトに変換する変換コンストラクタを記述する方法があります。第二の選択肢がすべて良い選択だとは分かりませんが、試してみてください。

+0

あなたの答えをありがとう。しかし、私は今dynamic_castが何か分からない。私はちょうど初心者です。 – user1305904

+0

@ user1305904 - http://stackoverflow.com/questions/2253168/dynamic-cast-in-c – DumbCoder

関連する問題