2017-01-16 17 views
0

私は次のコードを持っている:G ++収率でコンパイル基本クラスの派生クラス関数をどのように友人にすることができますか?

#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; 
} 

を:

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をprotectedにするか、またはクラスAでゲッターを定義するか、またはゲッターをクラスAに定義します。

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(); 
} 
関連する問題