⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nestedclasses.html

📁 关于 C++ 的历史无须我来介绍了
💻 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:&nbsp;巢状类别(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>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class InnerClass {<br>


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; ....<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<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 &lt;iostream&gt;<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 &lt; _length; i++) { <br>        _points[i] = new Point(); <br>        _points[i]-&gt;x(i*5);<br>        _points[i]-&gt;y(i*5);<br>    }     <br>}<br><br>void PointDemo::show() {<br>    for(int i = 0; i &lt; _length; i++) { <br>        cout &lt;&lt; "(x, y) = (" <br>             &lt;&lt; _points[i]-&gt;x() &lt;&lt; ", "<br>             &lt;&lt; _points[i]-&gt;y() &lt;&lt; ")"<br>             &lt;&lt; endl;<br>    } <br>}<br><br>PointDemo::~PointDemo() {<br>    for(int i = 0; i &lt; _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 &lt;iostream&gt;<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;">&nbsp; &nbsp; ...</span><br style="font-weight: bold;">


<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;
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;">&nbsp;&nbsp;&nbsp;
// Nested Class</span><br style="font-weight: bold;">


<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;
class Point {</span><br style="font-weight: bold;">


<span style="font-weight: bold;">&nbsp; &nbsp;
&nbsp; &nbsp; ....</span><br style="font-weight: bold;">


<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;
};</span><br style="font-weight: bold;">


<span style="font-weight: bold;">&nbsp; &nbsp; ....</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;">&nbsp; &nbsp; ...</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">


<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;
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;">&nbsp;&nbsp;&nbsp;
// 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;">&nbsp;&nbsp;&nbsp;
class Point {</span><br style="font-family: Courier New,Courier,monospace;">


<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp; &nbsp;
&nbsp; &nbsp; ....</span><br style="font-family: Courier New,Courier,monospace;">


<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp; &nbsp;
&nbsp; &nbsp; 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;">&nbsp; &nbsp; &nbsp;
&nbsp; ....</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">


<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;
};</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">


<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp; &nbsp; ....</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 &lt;iostream&gt;<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 &lt; _length; i++) { <br>        _points[i] = new Point(); <br>        _points[i]-&gt;x(i*5);<br>        _points[i]-&gt;y(i*5);<br>    }     <br>}<br><br>void PointDemo::show() {<br>    for(int i = 0; i &lt; _length; i++) { <br>        cout &lt;&lt; "(x, y) = (" <br>             &lt;&lt; _points[i]-&gt;x() &lt;&lt; ", "<br>             &lt;&lt; _points[i]-&gt;y() &lt;&lt; ")"<br>             &lt;&lt; endl;<br>    } <br>}<br><br>PointDemo::~PointDemo() {<br>    for(int i = 0; i &lt; _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 + -