2011-08-09 52 views
-1

在下面的代码为什么变量我应该从类a公开?为什么不能保密或保护?我想我错过了一些成员对象的基础知识。是吗 ?成员对象 - 为什么只有公共变量可以访问?

#include <iostream> 

class a 
{ 
public: 
    int i; 
}; 

class b 
{ 
private: 
    a a1; 
public: 
    void show() 
    { 
     a1.i=5; 
     std::cout << a1.i; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    b b1; 
    b1.show(); 
    return 0; 
} 
+2

您的例子没有任何嵌套类。对于'a'是一个嵌套的'b'类,它必须在后者中定义。 'class B {class A {/ * ... * /};/* ... * /};' – Praetorian

+2

这不是嵌套类,而是一个包含对另一个类的对象的引用的类。 –

回答

1

公共成员可以被任何东西访问。受保护的成员只能由派生类和朋友访问。私人纪念只能由朋友访问。由于b既不是派生类也不是a的朋友,它只能查看公共成员。如果你想让a.i受到保护,则A必须包含friend b,否则b必须从a继承。

class b; 
class a { 
    friend b; 
    int i; 
}; 

class b : public a { 
+0

在这种情况下它真的是嵌套类吗? – Sam

+0

嵌套类只是谈论“遏制”的另一种方式。 B包含A,所以它们是嵌套的。尽管这里没有继承,所以B只能访问A的变量(如果它们是公共的)。更好的方法是在A中提供一个公共访问函数,它将返回本身应该是私有的或受保护的变量的值。 –

+0

由于OP最初会滥用(或误解)嵌套类,所以我试图用最小的改变来完成他的目标,这根本不涉及嵌套。它也可以通过嵌套完成,如其他答案所示。 –

2

这不是一个嵌套类。它只是一个碰巧拥有一个类型为另一个类的成员变量的类。所以正常规则适用。

+0

对于嵌套类,规则将在下一个标准中发生变化。 –

2

a和b不是嵌套的。

“套”就意味着这样的:

class b 
{ 
    class a 
    { 
    }; 
}; 

你正在做那么,什么是简单的创建一个内部B的一个实例。所以,如果你想在你的主函数中定义它,那么b对a有相同的访问权限。

+0

@vlad:感谢分号:)我太习惯于C# – Sylence

+0

要复制OP的明确意图,您可能希望A是b的嵌套类,成员名称为a1。 –

+0

是纠正了这一点。谢谢 – Sylence

0

您是说,仅仅因为B类包括的类的对象就应该被允许访问类的私有成员?如果这是事情的运作方式,那么隐私就没有多少意义。我在课堂上声明了一些私密的东西,这样你就不必担心它们,所以我可以在不破坏代码的情况下更改我的课程的私人成员。如果你所要求的是真实的,那么这些都不会奏效。

+0

好的。知道它不是真的嵌套。我的另一个问题是,我怎样才能最好地达到a类的变量是私有的,并且可以从类b的函数中访问。我需要为B班做一个朋友课吗? – Sam

+0

a类必须声明b为朋友,即必须允许b有权访问,b不能要求访问a。只要把'朋友班b'放在班级a的某个地方。 – john

0

你的类不是嵌套的。只有同一班级的成员或朋友可以访问私有变量。由于“b”不是“a”的成员或朋友,因此只能通过公开或使用geter和setter方法访问变量“i”。请参阅:http://www.cplusplus.com/doc/tutorial/classes/ setter方法的一个例子是:

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
}; 

void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

int main() { 
    CRectangle rect, rectb; 
    rect.set_values (3,4); 
    rectb.set_values (5,6); 
    cout << "rect area: " << rect.area() << endl; 
    cout << "rectb area: " << rectb.area() << endl; 
    return 0; 
} 
相关问题