2012-04-19 23 views
2

У меня есть базовый класс Fraction и производный класс iFraction. Фракция представляет собой неправильные фракции, а iFraction представляет собой смешанные фракции.Функция друга базового класса и производного класса

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

Теперь я хочу объявить функцию друга этих двух классов, а именно convertF. Функция convertF может преобразовывать неправильные фракции (фракции) в смешанные фракции (iFraction). Как холодно я это делаю? На самом деле, я хотел бы объявить функцию как это:

friend iFraction convertF (Fraction &Fra); 

Однако, она не может быть объявлена ​​в пределах базовой Calss фракции. Зачем?

ответ

2

С friend отношения не наследуются, вам нужно объявить convertF в качестве друга обоих классов. Но вам это нужно только в том случае, если функция нуждается в доступе к внутренним элементам этих классов - вы уверены, что открытого интерфейса классов недостаточно?

Еще одна причина, чтобы попытаться избежать такого двойного друга, заключается в том, что она создаст круговую зависимость между этими классами через подпись convertF.

Обновление: Именно поэтому вы не можете объявить свою функцию друга так, как вы показываете выше. Для этого компилятор должен знать полное определение iFraction, пока оно еще не закончено с определением базового класса Fraction, что невозможно.

Технически он может работать наоборот, передовым объявлением iFraction. Хотя я до сих пор не считаю это хорошим решением. Вы уверены, что ваша иерархия классов правильная?

+0

Спасибо за ваш ответ. Теперь я понимаю, почему я не могу этого сделать. Но как я мог реализовать свою цель, которая преобразует Fraction в iFraction – user1305904

+0

, класс Fraction имеет два элемента данных: один для числителя и один для знаменателя. Класс iFraction имеет еще один memember iNum, который представляет собой часть целого числа – user1305904

+0

@ user1305904, после двойной проверки условий теперь я уверен, что ваше отношение наследования неверно: смешанная фракция ** не ** неправильная фракция. Конечно, конверсия между ними вполне разумна. –

2

Для этого вам не нужна функция друга. Существует два способа сделать это с помощью dynamic_cast или написать конструктор преобразования, который принимает объект Fraction и преобразует его в объект iFraction. Я не уверен, что второй вариант - отличный вариант, но попробовать.

+0

Спасибо за ваш ответ. Однако я не знаю, что такое dynamic_cast. Я просто новичок. – user1305904

+0

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

Смежные вопросы