我如何才能将基 class 中的派生 class 函数加好友?
How can I friend a derived class function in the base class?
我有以下代码:
#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();
我的想法是,当编译器正在通过 class A 定义时,它还不知道 class 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();
编译器似乎无法解析给定的函数。
如何使派生的 class 函数成为基 class 中的朋友?
您的代码似乎违反了数据封装的基本概念。要解决它,请按照@rici 的建议使 A::a 受到保护,或者在 class 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();
}
我有以下代码:
#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();
我的想法是,当编译器正在通过 class A 定义时,它还不知道 class 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();
编译器似乎无法解析给定的函数。
如何使派生的 class 函数成为基 class 中的朋友?
您的代码似乎违反了数据封装的基本概念。要解决它,请按照@rici 的建议使 A::a 受到保护,或者在 class 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();
}