2017-01-16 1 views
0

나는 다음과 같은 코드가 있습니다기본 클래스에서 파생 클래스 함수를 친구로 만들려면 어떻게해야합니까?

#include <iostream> 

class A { 
    private: 
     int a; 
    public: 
     void setA(int a_); 
    friend int B::getA(); 
}; 

class B : public A { 
    public: 
     int getA(); 
}; 

void A::setA(int a_) { 
    a = a_; 
} 

int B::getA() { 
    return a; 
} 

int main() { 
    B myB; 
    myB.setA(9); 

    std::cout << myB.getA()<< std::endl; 
    return 0; 
} 

가 g로 컴파일 ++ 수율 : 컴파일러는 클래스를 통해 정의를 갈 때

friend.cpp:10:16: error: use of undeclared identifier 'B' 
    friend int B::getA(); 

내 생각은, 아직 클래스 B에 대해 알고하지 않는 것이 . 따라서,이 문제를 돌봐 B를 선언 전달할 수 있습니다 :

#include <iostream> 

class B; 

class A { 
... 

을 꽤 작업을 수행한다 :

friend.cpp:10:16: error: incomplete type 'B' named in nested name specifier 
    friend int B::getA(); 

컴파일러가 주어진대로 함수를 해석 할 수없는 것처럼 보입니다.

어떻게 파생 클래스 함수를 기본 클래스의 친구로 만들 수 있습니까?

+3

이 때문에 C++에 'protected'가 있습니다. – rici

+0

오른쪽. 나는 보호받을 수있다. 나는 내가이 고의적 인 방식으로 컴파일되도록 할 수 있는지 궁금해했다. – user2079802

+0

친구 선언에서 B의 정의가 필요하고, B가 A의 정의를 상속해야한다. 나는이 패러독스에 대한 해결책을 볼 수 없다. –

답변

1

코드가 데이터 캡슐화의 기본 개념을 위반하는 것으로 보입니다. 이 문제를 해결하려면 @rici가 제안한대로 A :: a를 보호하거나 A 클래스의 getter를 정의하십시오.

class A { 
private: 
    int a; 
public: 
    void setA(int a_); 
    virtual int getA(); 
}; 

class B : public A { 
public: 
    int getA(); 
}; 

void A::setA(int a_) { 
    a = a_; 
} 
int A::getA() { 
    return a; 
} 

int B::getA() { 
    return A::getA(); 
} 
관련 문제