作者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