📄 nestedclasses.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>巢状类别(Nested Classes)</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">C++
Gossip: 巢状类别(Nested Classes)</a></h1>
类别可以定义在另一个类别之中,这样的类别称之为巢状类别或内部类别,内部类别只被外部包裹的类别所见,当某个Slave类别完全只服务于一个
Master类别时,您可以将之设定为内部类别,如此使用Master类别的人就不用知道Slave的存在。<br>
<br>
一个巢状类别通常宣告在"private"区域,也可以宣告在"protected"或"public"区域,一个宣告的例子如下:<br>
<div style="margin-left: 40px; font-weight: bold; font-family: Courier New,Courier,monospace;">class
OuterClass {<br>
private:<br>
class InnerClass {<br>
// ....<br>
};<br>
};<br>
</div>
<br>
以下是个巢状类别的简单示范:<br>
<ul>
<li>PointDemo.h</li>
</ul>
<pre>class PointDemo {<br>public:<br> PointDemo(int);<br> ~PointDemo();<br> <br> void show();<br>private:<br><br> // Nested Class<br> class Point {<br> public:<br> Point();<br> Point(int, int);<br> int x() { return _x; }<br> int y() { return _y; }<br> void x(int x) { _x = x; }<br> void y(int y) { _y = y; }<br> private:<br> int _x;<br> int _y;<br> };<br> <br> Point **_points;<br> int _length;<br>};</pre>
<br>
实作内部类别定义时,必须同时指定外部类别与内部类别,中间以::连结,例如:<br>
<ul>
<li>PointDemo.cpp</li>
</ul>
<pre>#include <iostream><br>#include "PointDemo.h"<br>using namespace std;<br><br>// 实作内部类别<br>PointDemo::Point::Point() {<br> _x = 0;<br> _y = 0;<br>}<br><br>// 实作内部类别<br>PointDemo::Point::Point(int x, int y) {<br> _x = x;<br> _y = y;<br>}<br><br>PointDemo::PointDemo(int length) : _length(length) {<br> _points = new Point*[_length];<br> for(int i = 0; i < _length; i++) { <br> _points[i] = new Point(); <br> _points[i]->x(i*5);<br> _points[i]->y(i*5);<br> } <br>}<br><br>void PointDemo::show() {<br> for(int i = 0; i < _length; i++) { <br> cout << "(x, y) = (" <br> << _points[i]->x() << ", "<br> << _points[i]->y() << ")"<br> << endl;<br> } <br>}<br><br>PointDemo::~PointDemo() {<br> for(int i = 0; i < _length; i++) { <br> delete _points[i];<br> } <br> delete [] _points;<br>}<br></pre>
<br>
使用PointDemo的使用者不必知道Point类别的存在,直接呼叫show()函式就可以显示Point资料:<br>
<ul>
<li>main.cpp</li>
</ul>
<pre>#include <iostream><br>#include "PointDemo.h"<br>using namespace std;<br><br>int main() {<br> PointDemo demo(10);<br> demo.show(); <br> return 0;<br>}<br></pre>
<br>
<span class="postbody">
执行结果:</span><br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">(x, y) = (0, 0)<br>
(x, y) = (5, 5)<br>
(x, y) = (10, 10)<br>
(x, y) = (15, 15)<br>
(x, y) = (20, 20)<br>
(x, y) = (25, 25)<br>
(x, y) = (30, 30)<br>
(x, y) = (35, 35)<br>
(x, y) = (40, 40)<br>
(x, y) = (45, 45)</span></small><span style="color: rgb(255, 255, 255);"><br>
</span></td>
</tr>
</tbody>
</table>
<br>
在巢状类别结构中,外部类别不能存取内部类别的私用成员,如果想要存取内部类别的私用成员的话,必须宣告其为friend,例如:<br>
<div style="margin-left: 40px; font-family: Courier New,Courier,monospace;"><span style="font-weight: bold;">class PointDemo {</span><span style="font-weight: bold;"></span><br style="font-weight: bold;">
<span style="font-weight: bold;"> ...</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
friend class Point;</span><br style="font-weight: bold;">
<br style="font-weight: bold;">
<span style="font-weight: bold;">private:</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
// Nested Class</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
class Point {</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
};</span><br style="font-weight: bold;">
<span style="font-weight: bold;"> ....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">};</span><br>
</div>
<br>
同样的,内部类别不可存取外部类别的私用成员,如果要存取私用成员的话,必须宣告其为friend,例如:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">class PointDemo {</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">public:</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> ...</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
friend class Point;</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">private:</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
// Nested Class</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
class Point {</span><br style="font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
....</span><br style="font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
friend class PointDemo;</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
....</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">
};</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> ....</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">};</span><br>
<span style="font-weight: bold; font-style: italic;"></span></div>
<span style="font-weight: bold; font-style: italic;"><br>
</span>存取外部类别的非静态成员时,必须透过物件、指标或是参考,而不是直接呼叫。<br>
<br>
您也可以将内部类别独立定义在一个档案中,例如:<br>
<ul>
<li>PointDemo.h</li>
</ul>
<pre>class PointDemo {<br>public:<br> PointDemo(int);<br> ~PointDemo();<br> <br> void show();<br>private:<br><br> // Nested Class<br> class Point;<br> <br> Point **_points;<br> int _length;<br>};<br></pre>
<span style="font-weight: bold; font-style: italic;"></span><br>
<ul>
<li>Point.h</li>
</ul>
<pre>class PointDemo::Point {<br>public:<br> Point();<br> Point(int, int);<br> int x() { return _x; }<br> int y() { return _y; }<br> void x(int x) { _x = x; }<br> void y(int y) { _y = y; }<br>private:<br> int _x;<br> int _y;<br>};<br></pre>
<br>
<ul>
<li>PointDemo.cpp</li>
</ul>
<pre>#include <iostream><br>#include "PointDemo.h"<br>#include "Point.h"<br>using namespace std;<br><br>PointDemo::PointDemo(int length) : _length(length) {<br> _points = new Point*[_length];<br> for(int i = 0; i < _length; i++) { <br> _points[i] = new Point(); <br> _points[i]->x(i*5);<br> _points[i]->y(i*5);<br> } <br>}<br><br>void PointDemo::show() {<br> for(int i = 0; i < _length; i++) { <br> cout << "(x, y) = (" <br> << _points[i]->x() << ", "<br> << _points[i]->y() << ")"<br> << endl;<br> } <br>}<br><br>PointDemo::~PointDemo() {<br> for(int i = 0; i < _length; i++) { <br> delete _points[i];<br> } <br> delete [] _points;<br>}<br></pre>
<br>
<ul>
<li>Point.cpp</li>
</ul>
<pre>#include "PointDemo.h"<br>#include "Point.h"<br><br>PointDemo::Point::Point() {<br> _x = 0;<br> _y = 0;<br>}<br><br>PointDemo::Point::Point(int x, int y) {<br> _x = x;<br> _y = y;<br>}<br></pre>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -