2011-08-09 103 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; 
} 
相關問題