本身動手編寫一個CStack類,包括頭文件CStack.h以及源文件CStack.cpp。
函數
遇到了幾個問題:
spa
1.每一個文件都要寫using namespace std;沒寫的文件會報錯:缺乏類型說明符……(這不是廢話嗎。。但是我就是這樣報錯許久。。。)
code
2.class CStack的定義放在.h中,在.cpp文件中不能再重複該定義,不然編譯會報錯(class重複定義)。.cpp文件只要包括class中的各個未定義成員函數的定義便可。
orm
3.在class定義中定義的成員函數默認是inline函數(即便不顯示聲明inline)。若是一個inline函數會在多個源文件中被用到,那麼必須把它定義在頭文件中。若是不會在多個源文件中用到,則class中未定義的成員函數(即.h文件中只聲明且沒有顯示聲明inline的成員函數)也能夠在.cpp文件中定義的時候加上inline,或者聲明和定義時都加上inline均可以(便可以正常編譯及運行)!可是仍是建議將inline函數的定義放在頭文件中。編譯器
先上代碼:string
CStack.h:
it
#pragma once //保證頭文件只被編譯一次 #include <vector> #include <string> using namespace std; class CStack { public: CStack(void); ~CStack(void); bool push(const string& elem); bool pop(string &elem); bool peek(string &elem); bool empty(); bool full(); int size(){ return _stack.size(); } private: vector<string> _stack; };
CStack.cpp:編譯
#include "CStack.h" using namespace std; bool CStack::push(const string& elem){ if(full()){ return false; } _stack.push_back(elem); return true; } bool CStack::full(){ return _stack.size() == _stack.max_size(); } bool CStack::pop(string &elem){ if(empty()){ return false; } elem = _stack.back(); _stack.pop_back(); return true; } bool CStack::peek(string &elem){ if(empty()){ return false; } elem = _stack.back(); return true; } inline bool CStack::empty(){ return 0 == _stack.size(); } CStack::CStack(void){ } CStack::~CStack(void){ }
#ifndef與#pragma once的區別:class
#ifndef的方式依賴於宏名字不能衝突,這不光能夠保證同一個文件不會被包含屢次,也能保證內容徹底相同的兩個文件不會被不當心同時包含。固然,缺點就是若是不一樣頭文件的宏名不當心「撞車」,可能就會致使頭文件明明存在,編譯器卻硬說找不到聲明的情況。方法
#pragma once(貌似微軟編譯器獨有,不支持跨平臺)則由編譯器提供保證:同一個文件不會被編譯屢次。注意這裏所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你沒必要再費勁想個宏名了,固然也就不會出現宏名碰撞引起的奇怪問題。對應的缺點就是若是某個頭文件有多份拷貝,本方法不能保證他們不被重複包含。固然,相比宏名碰撞引起的「找不到聲明」的問題,重複包含更容易被發現並修正。
方式一由語言支持因此移植性好,方式二 能夠避免名字衝突。