HI,關於產品C++內部類
在C++中的內部類,
class A {
public:
void f1();
private:
void f2();
class B {
private void f3();
};
}
是否一個內部類(B)具有一個指向它的父類(A)? (就像它在Java中那樣)。 而且B可以調用它的父類public/private方法(就像它在Java中一樣)。
謝謝。
HI,關於產品C++內部類
在C++中的內部類,
class A {
public:
void f1();
private:
void f2();
class B {
private void f3();
};
}
是否一個內部類(B)具有一個指向它的父類(A)? (就像它在Java中那樣)。 而且B可以調用它的父類public/private方法(就像它在Java中一樣)。
謝謝。
否 - 在C++中,嵌套類僅影響名稱和可見性,而不影響類本身的語義。就生成的代碼而言,嵌套類與嵌套類沒有區別。
所有改變的是可見性和名稱(例如,如果它位於外部類的private:
部分中,它對外界不可見,並且如果它位於public:
部分中,則它是可見的,但是(當然)你可以使用outer_class::inner_class
,它仍然是一個完全獨立的類 - 例如,你可以創建一個內部類的實例,而不需要創建任何外部類的實例。
編輯:對不起,我錯過了部分你的問題在C++ 0x中,內部類可以訪問外部類的私有部分 - 實質上,就好像外部類已經將內部類聲明爲它的朋友一樣,所以私有名稱是可見的,但是你仍然需要傳遞一些東西就像引用外部類的對象,然後它可以調用外部類的任何非靜態成員函數。
雖然這不應該是這種情況,但我相信大多數編譯器已經實現了這個特定的部分。
不,B類沒有指向A類的指針,除非您明確地添加它。
它有一個指向父:第
是否有機會獲得父母的私有成員:排序的
我覺得如果訪問沒有很好地界定標準我可以錯誤。
但是你可以用g ++
#include <iostream>
class X
{
class Y
{
public:
Y(X* p)
:parent(p)
{}
void TryY()
{
// Access a private member of X
++(parent->value);
}
private:
X* parent;
};
public:
X()
:y(this)
{
value = 4;
}
void TryY()
{
y.TryY();
std::cout << value << std::endl;
}
private:
Y y;
int value;
};
int main()
{
X x;
x.TryY();
}
根據*§11.8/ 1 *,C++ 03應該是不正確的行爲。 – 2010-04-22 01:34:22
看來,這是C++ 0x中不斷變化的訪問。 C++ 03說:「嵌套類的成員對封閉類的成員沒有特殊訪問權。」 C++ 0x FCD表示:「嵌套類是一個成員,因此與任何其他成員具有相同的訪問權限。」 (均爲§11.8/ 1)。 (該更改由CWG缺陷45和494引入:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45和http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html#494) – 2010-04-22 01:12:07
不錯 - 這消除了編寫'friend class {'的衝動,它受到一些編譯器的支持,但顯然不會使嵌套類不是成員! – Potatoswatter 2010-04-22 02:39:43
@Potato:有趣的是,即使在嚴格的C++ 03模式下的Comeau也不遵循C++ 03語言。這使我相信(a)可能出於某種原因遵循C++ 03語言(雖然我還沒有弄清楚爲什麼,除了上面鏈接的DR所提及的原因外)和( b)很可能沒有人真正遵循C++ 03語言:-)。 – 2010-04-22 16:20:46