C++ 派生类的朋友可以访问哪些变量?
为了简化我的问题,我有这样的东西:C++ 派生类的朋友可以访问哪些变量?,c++,class,friend,derived,C++,Class,Friend,Derived,为了简化我的问题,我有这样的东西: 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
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]
}
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;
}
基本上,我的void函数需要访问基类的受保护类中的内容。我想在protected部分中定义这些变量。对于必须与派生类建立友好关系的函数,是否还有其他方法可以访问a和b?您可以在
派生中定义私有方法:派生中的任何方法都可以访问受保护的Base成员
函数是派生的朋友,因此它可以调用派生中的那些私有方法,这些私有方法反过来访问受保护的Base成员
编辑以回复下面的评论
get_a()
成员方法和a
成员数据是它们类的成员。这些成员的实例存在于其类的实例中。它们只存在于实例中,所以要访问它们,需要通过类的实例访问它们
例如,类似这样的内容:
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]
}
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
void function()
{
Derived objectDerived;
int d[objectDerived.a][objectDerived.b];
[stuff]
}
这应该很好;当你尝试它时会发生什么?它告诉我a和b没有在scopehmm中声明,你是说“friend void function();”行应该在派生类的“Private:”下吗?嗯,所以我在派生类的Private部分写了两个函数:“class-Derived:public-Base{Private:int-get_a(){return a;}int get_b(){return b;]public:friend void function();}void function(){int a=get_a();int b=get_b();}但这仍然告诉我get_a和get_b不在范围内。有什么问题吗?