實現CStack類遇到的問題

        本身動手編寫一個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(貌似微軟編譯器獨有,不支持跨平臺)則由編譯器提供保證:同一個文件不會被編譯屢次。注意這裏所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你沒必要再費勁想個宏名了,固然也就不會出現宏名碰撞引起的奇怪問題。對應的缺點就是若是某個頭文件有多份拷貝,本方法不能保證他們不被重複包含。固然,相比宏名碰撞引起的「找不到聲明」的問題,重複包含更容易被發現並修正。

方式一由語言支持因此移植性好,方式二 能夠避免名字衝突。

相關文章
相關標籤/搜索