<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
閱讀此文需要掌握的知識點:回撥函數,模板類,類別範本,棧。
首先模板分為函數模板和類別範本
想到模板,就會聯想到泛型程式設計
泛型程式設計:編寫與型別無關的通用程式碼,是程式碼複用的一種手段。模板是泛型程式設計的基礎。
網圖:
在之前,我們已經知道了函數過載
還是那一個例子 Swap函數交換 int double char
哪怕是函數過載,我們也要寫三個,但是如果有了模板,我們只需要:
告訴編譯器一個模板,讓編譯器根據不同的型別利用該模板來生成程式碼
這裡直接上程式碼。
#pragma once #include <Stack> using namespace std; typedef void(*PRINTSTACK)(void *); template<typename T> class ReverseArray { public: ReverseArray(); ~ReverseArray(); void pushStack(T data); T getTopStack(); void popStack(); int getSizeStack(); void printStack(void * data, PRINTSTACK print); private: stack<T> m_stack; }; template<typename T> inline ReverseArray<T>::ReverseArray() { } template<typename T> inline ReverseArray<T>::~ReverseArray() { } template<typename T> inline void ReverseArray<T>::pushStack(T data) { m_stack.push(data); } template<typename T> inline T ReverseArray<T>::getTopStack() { return T(m_stack.top()); } template<typename T> inline void ReverseArray<T>::popStack() { m_stack.pop(); } template<typename T> inline int ReverseArray<T>::getSizeStack() { return m_stack.size(); } template<typename T> inline void ReverseArray<T>::printStack(void* data,PRINTSTACK print) { print(data); }
main.cpp
#include <iostream> #include <string> #include "ReverseArray.h" using namespace std; #define CHAR_SIZE 5 #define STRING_SIZE 7 /* 描述:反轉陣列(任意型別) */ typedef struct PERSON { int age; char name[64]; }Person; void myPrint(void *data) { Person *p = (Person*)data; cout << "age;" << p->age << " name:" << p->name << endl; } void printString(void * data) { string str = *((string*)data); cout << str << endl; } void printChar(void * data) { char c = *((char*)data); cout << c << endl; } void test() { ReverseArray<Person> *pStack = new ReverseArray<Person>; Person p1 = { 3,"hudf"}; Person p2 = { 5,"akso"}; Person p3 = { 7,"及家屬的" }; Person p4 = { 8,"口袋"}; Person p5 = { 8,"husdh"}; pStack->pushStack(p1); pStack->pushStack(p2); pStack->pushStack(p3); pStack->pushStack(p4); pStack->pushStack(p5); while (pStack->getSizeStack() > 0) { Person data = pStack->getTopStack(); pStack->printStack((void *)&data,myPrint); pStack->popStack();//進出棧操作的是棧頂 } cout << "========string array============" << endl; ReverseArray<string> *pStringStack = new ReverseArray<string>; string array[] = { "tyu","hello","start","wei","come","waht","world"}; string newArray[STRING_SIZE]; // cout << array->size() << endl;//這裡取第一個字串中元素的個數 for (size_t i = 0; i < STRING_SIZE; ++i) { pStringStack->pushStack(array[i]); } cout << "stack size:" << pStringStack->getSizeStack() << endl; int i = 0; while (pStringStack->getSizeStack() > 0) { string data = pStringStack->getTopStack(); pStringStack->printStack((void *)&data, printString); newArray[i] = data; pStringStack->popStack();//進出棧操作的是棧頂 ++i; } cout << "=============print newArray============" << endl; for (int i = 0; i < STRING_SIZE; ++i) { cout << newArray[i]<< " "; } cout << endl; cout << "========char array============" << endl; ReverseArray<char> *pCharStack = new ReverseArray<char>; char charArray[] = {'a','b','c','d','e'}; char newCharArray[CHAR_SIZE]; for (size_t i = 0; i < CHAR_SIZE; ++i) { pCharStack->pushStack(charArray[i]); } cout << "stack size:" << pCharStack->getSizeStack() << endl; int n = 0; while (pCharStack->getSizeStack() > 0) { char data = pCharStack->getTopStack(); pCharStack->printStack((void *)&data, printChar); newCharArray[n] = data; pCharStack->popStack();//進出棧操作的是棧頂 ++n; } cout << "=============print newCharArray============" << endl; for (int i = 0; i < CHAR_SIZE; ++i) { cout << newCharArray[i] << " "; } cout << endl; } int main() { test(); return 0; } // 執行程式: Ctrl + F5 或偵錯 >「開始執行(不偵錯)」選單 // 偵錯程式: F5 或偵錯 >「開始偵錯」選單 // 入門使用技巧: // 1. 使用解決方案資源管理器視窗新增/管理檔案 // 2. 使用團隊資源管理器視窗連線到原始碼管理 // 3. 使用輸出視窗檢視生成輸出和其他訊息 // 4. 使用錯誤列表視窗檢視錯誤 // 5. 轉到「專案」>「新增新項」以建立新的程式碼檔案,或轉到「專案」>「新增現有項」以將現有程式碼檔案新增到專案 // 6. 將來,若要再次開啟此專案,請轉到「檔案」>「開啟」>「專案」並選擇 .sln 檔案
vs2017控制檯輸出程式。
類別範本的使用需要將類的宣告與定義放在.h檔案中,因為模板本身是一種不確定的型別,編譯器在編譯的時候需要在.h檔案中去找模板中相應的定義。
到此這篇關於C++詳解如何通過模板實現元素的反序的文章就介紹到這了,更多相關C++元素的反序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45