2012-11-05 38 views
-1

为了简化我的问题,我有这样的事情:派生类的朋友可以访问什么变量?

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?

+2

这应该做工精细;当你尝试时会发生什么? – ecatmur

+0

它告诉我a和b没有在范围 – user1799323

回答

0

您可以在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; 
} 
+0

中声明嗯,你是说“friend void function();”线应该在Derived类的“Private:”下面? “派生类:公共基础{ 私人: – user1799323

+0

嗯,所以我在派生类的私有部分写了两个功能 INT get_a(){ 返回; } int get_b(){ return b; ] public: friend void function(); (){ } void function(){ int a = get_a(); int b = get_b(); }' 但是,这仍然告诉我,get_a和get_b超出了范围。任何想法有什么不对? – user1799323

+0

@ user1799323我通过编辑我的答案回复了您的评论。 – ChrisW

0

你的功能需要通过推断为类的实例来访问a和b如下

void function() 
{ 
Derived objectDerived; 
int d[objectDerived.a][objectDerived.b]; 
[stuff] 
} 
相关问题