作者ric2k1 (Ric)
看板EE_DSnP
標題[情報] 關於 class 裡面的 class
時間Thu May 14 00:04:48 2009
有同學在問: class BSTree::iterator 裡面可否 access BSTree::_root
這個 private data member?
Well, 這樣問其實有點不夠精確, 如果我說 可以, 怕同學誤會我的意思...
看一下底下的例子好了:
[Example 1]
===========
class A
{
public:
class B
{
public:
void f() { _data = 10; }
};
private:
int _data;
};
這個 compile 不會過, 因為它會 complain "A::B::_data" is undefined!!
(事實上是 complain: invalid use of nonstatic data member 'A::_data'
為什麼呢? class B 是 define a type inside class A, NOT define any object
or part of A!!
[Example 2]
===========
class A
{
public:
class B
{
A _a;
public:
void f() { _a._data = 10; }
};
private:
int _data;
};
還是會 compile 不過, 因為 ---
(1) A _a; <== field `_a' has incomplete type
(2) _a._data = 10; <== error: `_a' was not declared in this scope
為什麼呢? 這就像是在 class A 裡面 define 了一個 class A 的 object 一樣,
會掉入無窮回圈, 當然不給過!!
[Example 3]
===========
class A
{
public:
class B
{
A *_a;
public:
void f() { _a->_data = 10; }
};
private:
int _data;
};
這樣子就可以了!! 注意 "A _a" 與 "A *_a" 的差別!!
但是 A*_a 要如何 assign 呢?
你可以 (比方說):
B(A& a):_a(&a) {}
然後在外面這樣使用:
int main()
{
A a;
A::B b(a);
b.f();
}
所以, 以下的例子當然也是可以的囉!!
[Example 4]
===========
class A
{
public:
class B
{
public:
int f(const A& a) { return a._data; }
};
A(int i): _data(i) {}
private:
int _data;
};
int main()
{
A a(10);
A::B b;
cout << b.f(a) << endl;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.45.229
1F:推 Trumen:未看先推 05/14 00:05
2F:推 eorlthexiv:請問沒辦法使用friend的方式嗎? 05/16 14:53
3F:→ ric2k1:friend 只是讓你可以不用透過 public functions 就可以直接 05/16 23:17
4F:→ ric2k1:access privite members, 並不能解決 1 & 2 的問題!! 05/16 23:18
5F:→ eorlthexiv:了解 謝謝 05/16 23:21