实现CStack类遇到的问题
2019獨角獸企業重金招聘Python工程師標準>>>
????????自己動手編寫一個CStack類,包括頭文件CStack.h以及源文件CStack.cpp。
????????遇到了幾個問題:
????????1.每個文件都要寫using namespace std;沒寫的文件會報錯:缺少類型說明符……(這不是廢話嗎。。可是我就是這樣報錯許久。。。)
????????2.class CStack的定義放在.h中,在.cpp文件中不能再重復該定義,否則編譯會報錯(class重復定義)。.cpp文件只要包括class中的各個未定義成員函數的定義即可。
????????3.在class定義中定義的成員函數默認是inline函數(即使不顯示聲明inline)。如果一個inline函數會在多個源文件中被用到,那么必須把它定義在頭文件中。如果不會在多個源文件中用到,則class中未定義的成員函數(即.h文件中只聲明且沒有顯示聲明inline的成員函數)也可以在.cpp文件中定義的時候加上inline,或者聲明和定義時都加上inline都可以(即可以正常編譯及運行)!但是還是建議將inline函數的定義放在頭文件中。
????????先上代碼:
????CStack.h:
????CStack.cpp:
#include?"CStack.h"using?namespace?std;boolCStack::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?boolCStack::empty(){return?0?==?_stack.size(); }CStack::CStack(void){ }CStack::~CStack(void){}????????#ifndef與#pragma once的區別:
????????#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心“撞車”,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況。
#pragma once(貌似微軟編譯器獨有,不支持跨平臺)則由編譯器提供保證:同一個文件不會被編譯多次。注意這里所說的“同一個文件”是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復包含。當然,相比宏名碰撞引發的“找不到聲明”的問題,重復包含更容易被發現并修正。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突。
轉載于:https://my.oschina.net/handsomedz/blog/661874
總結
以上是生活随笔為你收集整理的实现CStack类遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Freezer - 备份云硬盘实现
- 下一篇: web端功能测试总结(一)