2012-04-19 5 views
2

나는 기본 클래스 Fraction과 파생 클래스 iFraction을가집니다. 분수는 부적절한 분수를 나타내고 i 분수는 혼합 분수를 나타냅니다.기본 클래스와 파생 클래스의 friend 함수

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

이제이 두 클래스의 friend 함수, 즉 convertF를 선언하고 싶습니다. convertF 함수는 부적절한 분수 (분수)를 혼합 분수 (iFraction)로 변환 할 수 있습니다. 내가 얼마나 차가워? 사실,이 같은 함수를 선언하고 싶습니다 :

friend iFraction convertF (Fraction &Fra); 

그러나, 기본 CALSS 분수 내에서 선언 할 수 없습니다. 왜?

답변

2

friend 관계가 상속되지 않으므로 convertF을 두 클래스의 친구로 선언해야합니다. 하지만 함수가 이러한 클래스의 내부에 액세스해야하는 경우에만이 함수가 필요합니다. 클래스의 공용 인터페이스로 충분하지 않습니까?

이러한 이중 친구를 피하기 위해 시도하는 또 다른 이유 중 하나는 convertF의 서명을 통해 이러한 클래스간에 순환 종속성을 생성한다는 것입니다.

업데이트 : 위와 같은 방식으로 친구 기능을 선언 할 수 없습니다. 이를 위해 컴파일러는 기본 클래스 Fraction의 정의로 아직 완료되지 않은 채로 iFraction의 전체 정의를 알아야합니다. 이는 불가능합니다.

기술적으로는 앞쪽에 iFraction이라고 선언하면 다른 방법으로도 작동 할 수 있습니다. 나는 여전히 그것을 좋은 해결책으로 생각하지는 않을 것이다. 클래스 계층 구조가 맞습니까?

+0

답변 해 주셔서 감사합니다. 자, 왜 내가 이것을 할 수 없는지 이해합니다. 그러나 분수를 iFraction – user1305904

+0

으로 변환하는 목적을 분별하는 방법은 분수 클래스에 분자와 분모의 두 가지 데이터 멤버가 있습니다. iFraction 클래스에는 정수 – user1305904

+0

@ user1305904의 일부를 나타내는 데이터 멤버가 하나 더 있습니다. 용어를 두 번 확인한 후에 상속 관계가 올바르지 않다고 확신합니다. 혼합 분수는 부적절한 부분이 아닙니다. 물론이 둘 사이의 변환은 완전히 합리적입니다. –

2

친구 기능이 필요하지 않습니다. dynamic_cast를 사용하거나 Fraction 객체를 가져 와서 iFraction 객체로 변환하는 변환 생성자를 작성하는 두 가지 방법이 있습니다. 두 번째 옵션이 모두 좋은 옵션이지만, 시도해 보았다면 확실하지 않습니다.

+0

답변 해 주셔서 감사합니다. 그러나, 나는 지금 dynamic_cast가 무엇인지 모른다. 나는 단지 초보자이다. – user1305904

+0

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

관련 문제