2

基本クラス Fraction と派生クラス iFraction があります。Fraction は仮分数を表し、iFraction は帯分数を表します。

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

ここで、これら 2 つのクラスのフレンド関数、convertF を宣言します。関数 convertF は仮分数 (Fraction) を帯分数 (iFraction) に変換できます。私はこれをどのくらい冷たくしますか?実際には、次のように関数を宣言したいと思います。

friend iFraction convertF (Fraction &Fra);

ただし、基本 calss Fraction 内で宣言することはできません。なぜ?

4

3 に答える 3

2

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

このようなダブル フレンドを回避しようとするもう 1 つの理由は、convertF.

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

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

于 2012-04-19T12:16:48.820 に答える
2

これにはフレンド機能は必要ありません。これを行うには、dynamic_cast を使用するか、Fraction オブジェクトを受け取り、それを iFraction オブジェクトに変換する変換コンストラクターを記述する 2 つの方法があります。2 番目のオプションが適切なオプションであるかどうかはよくわかりませんが、試してみる価値があります。

于 2012-04-19T12:17:01.963 に答える
0

これを読んでください:http://www.cprogramming.com/tutorial/friends.html

常に最初に概念を理解するようにしてください。

于 2012-04-19T12:20:45.637 に答える