Чтобы упростить мою проблему, у меня есть что-то вроде этого:
class Base {
private:
protected:
int a,b;
string c;
public:
[some functions here]
}
class Derived : public Base{
[some variables and functions]
friend void function();
}
void function(){
int d[a][b];
[stuff]
}
в основном, моей void-функции нужен доступ к вещам, которые находятся в защищенном классе базового класса. Я хотел бы сохранить эти переменные, определенные в защищенном разделе. Есть ли в любом случае функция, которая должна быть включена в класс Derived, чтобы иметь доступ к a и b?
Вы можете определить частные методы в Derived
: любой метод в Derived может получить доступ к защищенным членам Base.
Функция является другом Derived, поэтому она может вызывать те частные методы в Derived, которые, в свою очередь, получают доступ к защищенным членам Base.
Изменить, чтобы ответить на комментарий ниже
get_a()
метод члена и a
данные-члены являются членами своих классов. Экземпляры этих членов существуют в экземплярах их классов. Они не существуют, кроме как внутри экземпляра, поэтому для доступа к ним вам нужен доступ к ним через экземпляр класса.
Например, что-то вроде этого:
class Derived : public Base{
[some variables and functions]
friend void function(Derived& derived);
};
void function(Derived& derived)
{
int a = derived.get_a();
int b = derived.get_b();
// I don't know but even the following might work
int c = derived.a; // able to access field of friend's base class.
}
void test()
{
Derived* derived = new Derived();
function(*derived);
delete derived;
}
Ваши функции должны получить доступ к a и b через экземпляр класса Derived следующим образом
void function()
{
Derived objectDerived;
int d[objectDerived.a][objectDerived.b];
[stuff]
}