我有以下代码:
#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();
我的想法是,当编译器通过A类定义时,它还不知道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();
看起来编译器无法解析函数。
如何将派生类函数作为基类中的朋友?
答案 0 :(得分:1)
您的代码似乎违反了数据封装的基本概念。要解决它,要么像Arici建议的那样使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();
}