1. 程式人生 > >C++_巢狀類

C++_巢狀類

在C/C++中,可以將結構體/類的宣告放在另一個類中。在另一個類中宣告的類被稱為巢狀類,它通過新的型別類作用域來避免名稱混亂。

巢狀類的作用域:

1。如果巢狀類是在另一個類的私有部分宣告的,則只有後者知道它。

2。如果巢狀類是在另一個類的保護部分宣告的,則它對於後者來說是不可見得。

3。如果巢狀類在另一個類的共有部分宣告的,則允許後者,後者的派生類以及外部世界使用它,因為它是共有的。

示例巢狀類與模板組合使用:

將Queue類的定義轉換為模板時,不會對巢狀類帶來問題。

Queue.h標頭檔案

#ifndef QUEUETP_H_
#define QUEUETP_H_

template <class Item>
class QueueTP
{
private:
	enum{ Q_SIZE = 10};

	class Node
	{
	public:
		Item item;
		Node * next;
		Node(const Item &i) :item(i), next(0){}
	};

	Node * front;
	Node * rear;
	int items;				//current number of items in Queue
	const int qsize;		//maximum number of items in Queue

	QueueTP(const QueueTP &q) :qsize(0){}
	QueueTP & operator=(const QueueTP &q){ return *this; }

public:
	QueueTP(int qs = Q_SIZE);
	~QueueTP();
	bool isempty()const{
		return items == 0;
	}
	bool isfull()const{
		return items == qsize;
	}
	int queuecount()const{
		return items;
	}
	bool enqueue(const Item &item);
	bool dequeue(Item &item);
};


template<class Item>
QueueTP<Item>::QueueTP(int qs) :qsize(qs){
	front = rear = 0;
	items = 0;
}


template<class Item>
QueueTP<Item>::~QueueTP(){
	Node * temp;
	while (front != 0){
		temp = front;
		front = front->next;
		delete temp;
	}
}

template<class Item>
bool QueueTP<Item>::enqueue(const Item &item){
	if (isfull())
		return false;
	Node *add = new Node(item);
	if (add == NULL){
		return false;
	}
	items++;
	if (front == 0)
		front = add;
	else
		rear->next = add;
	
	rear = add;
	return true;
}

template<class Item>
bool QueueTP<Item>::dequeue(Item &item){
	if (front == 0)
		return false;
	item = front->item;
	items--;
	Node * temp = front;
	front = front->next;
	delete temp;
	if (items == 0)
		rear = 0;
	return true;
}

#endif

測試檔案

main.cpp

#include <iostream>
#include <string>

#include "Queue.h"

int main(){
	using std::cin;
	using std::cout;
	using std::string;
	using std::endl;


	QueueTP<string> cs(5);
	string temp;

	while (!cs.isfull())
	{
		cout << "Please enter your name. You will be "
			<< "served in the order of arrival.\n"
			"name :";
		getline(cin, temp);
		cs.enqueue(temp);
	}
	cout << "The queue is full. Processing begins!\n";

	while (!cs.isempty())
	{
		cs.dequeue(temp);
		cout << "Now processing " << temp << "...\n";
	}

	return 0;
}

測試截圖


相關推薦

C++_

在C/C++中,可以將結構體/類的宣告放在另一個類中。在另一個類中宣告的類被稱為巢狀類,它通過新的型別類作用域來避免名稱混亂。 巢狀類的作用域: 1。如果巢狀類是在另一個類的私有部分宣告的,則只有

C++ 的模板的特化定義不允許寫在定義的範圍內

最近在使用在使用模板特化寫一段程式時發現一個奇怪的問題,比如像如下程式碼: #include <iostream>using namespace std;class CMyClass{public: template <typename T> struct test { 

10、【C++】前向宣告、、區域性(內部類)

一、前向宣告     在C++中,類需要先定義,而後才能被例項化,但是實際存在一種場景是:兩個類需要相互引用或相互成為類中的子物件成員時,就無法先定義使用,在編譯環節就出現錯誤導致編譯失敗,這時就需要用到前向宣告,此外,前向宣告的類不能被例項化。 【示例】 //

C++在單例模式Singleton中自動釋放堆記憶體的應用

首先放出單例模式中的程式碼: singleton.h #ifndef SINGLETON_H #define SINGLETON_H #include <iostream> #include

C++ nested class 與外圍 訪問問題

/* 巢狀類 nested class 巢狀類的引入是為了更好的名稱空間使用。 巢狀類是名字在其外圍類的作用域中可見,但在其他類作用域或定義外圍類的作用域中不可見。 巢狀類的名字將不會與另一作用域中宣告的名字衝突。 但巢狀類是獨立的類,基本上與他們的外圍類不相關,因此外

C++的使用及對外部類的訪問許可權

本人能力、精力有限,所言所感都基於自身的實踐和有限的閱讀、查閱,如有錯誤,歡迎拍磚,敬請賜教——部落格園:錢智慧。 先上程式碼: 1 class Outer 2 { 3 public: 4 Outer(){m_outerInt=0;} 5 private:

C++與內部類

————————————————–先從定義上來區分————————————————– 巢狀類       所謂巢狀類就是可以在一個類中定義另一個類。這個被巢狀的類的作用域就只在它的上一級類中。       外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類

C++ 內部類(

內部類 內部類就像這個類的一個成員函式,所以內部類有權訪問外部類內容(包括private內容)。但是內部類就相當於在一個作用域內定義了一個類,這個作用域內的其他變數是無權訪問這個類的。 class Out{ public : void Fun (

可訪問性C#

 在類或結構內部定義的型別稱為巢狀型別:     巢狀型別的預設訪問性問protected,但也可以修改為Public等等;   巢狀型別如果需要訪問外部型別,需要將巢狀型別定義為public且需要將外部型別的例項作為巢狀型別建構函式的引數傳遞;之後巢狀型別就可以訪問外部型別

C/C++基礎----特殊工具和技術 (過載new和delete,RTT,限定作用域的列舉型別,成員指標,,區域性,volatile,連結指示 extern “C”)

過載new和delete 1呼叫operator new( 或new[])標準庫函式分配足夠大的、原始的、未命名的記憶體空間以便儲存特定型別的物件 2編譯器執行相應地建構函式以構造這些物件,併為其傳入初始值 3返回一個指向該物件的指標 可以在全域性作用域定義operator new,也可以定義為成員函式

C++模板+例項

queue.h #ifndef QUEUE_H_ #define QUEUE_H_ template<class Type> class Queue{ private: enum {Q_SIZE = 10}; class Node{

C++ 中的和區域性

C++ 中的巢狀類和區域性類 最近趁著春節假期空閒,找了本C++ Primer 學了幾章,發現C++ 中的許多特性自己都不知道。其中巢狀類和區域性類感覺還是蠻有用的,簡單的寫寫他們的用法。 巢狀類 所謂巢狀類就是可以在一個類中定義另一個類。這個被巢狀的類的作用域就只在它的

C++的使用方法

     在一個類的內部定義另一個類,我們稱之為巢狀類(nested class),或者巢狀型別。之所以引入這樣一個巢狀類,往往是因為外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類只用於外圍類的實現,且同時可以對使用者隱藏該底層實現。    雖然巢狀類在外圍類內部定義

C++中,呼叫外部類函式例子

class nestedClass // 內部類 { public: nestedClass() { testNestedClass(); } voi

C/C++ 區域性

class Interface { public: virtual void Fun() = 0; }; template <class T, class P> Interface* MakeAdapter(const T& obj, const P& arg) {

C++語言--友元-8.1----友元

前言:C++系列到此結束。終於可以寫點簡單的Jni了。感謝自己的努力!!! 友元是一種允許非類成員函式訪問類的非公有成員的一種機制。可以把一個函式指定為類的友元,也可以把整個類指定為另一個類的友

C++ 使用

C++巢狀類 1、巢狀類的名字只在外圍類可見。 2、類的私有成員只有類的成員和友元可以訪問,因此外圍類不可以訪問巢狀類的私有成員。巢狀類可以訪問外圍類的成員(通過物件、指標或者引用)。 3、一個好的巢狀類設計:巢狀類應該設成私有。巢狀類的成員和方法可以設為 public 。

C++回顧之前向宣告、、區域性

        先看看什麼是前向宣告。在C++中,類需要先定義,而後才能被例項化,但是實際存在一種場景是:兩個類需要相互引用或相互成為類中的子物件成員時,就無法先定義使用,在編譯環節就出現錯誤導致編譯失敗,這時就需要用到前向宣告,此外,前向宣告的類不能被例項化。下面是例子:

C++ 與外圍以及區域性對成員變數的訪問 【資料結構】

參考資料:《資料結構c++語言描述》 概念: 在一個類中定義的為巢狀類,定義巢狀類的類稱為外圍類。巢狀類只能在外圍類中使用。 定義巢狀類的目的就是為了隱藏資訊,這樣可以提高類的抽象能力。 例子如下: 其中,類B是一個巢狀類,類A是外圍類,類B定義在類A的類體內。 若干說

C++ 分支以及分支結構重點提及

目錄: 第三課課程筆記之分支判斷 前言: 第四節課的內容其實是第三節課的進階,所以對第三節課知識點還不熟悉的同學可以先點選上方連結返回到第三課的課堂筆記。因為基礎是決定下一步的基石。而在這節課,我們將學習分支判斷中的分支巢狀以及提及相關的注意要點。 事不宜遲,筆記走起: 分支