1. 程式人生 > >C++實現原型模式(複製簡歷)

C++實現原型模式(複製簡歷)

本程式碼實現了大話設計模式上覆制簡歷;

1.克隆物件比直接建立物件的優點在於,克隆是將原有物件的行為屬性帶到了新的物件中。

2.C++沒有克隆方法,要克隆一個物件,需要藉助拷貝建構函式來實現。拷貝建構函式中實現拷貝物件有淺拷貝和深拷貝:
淺拷貝是指物件複製時,只是對於物件中的資料成員進行值拷貝;深拷貝是指物件賦值時,對於物件的簡單資料成員進行值拷貝,對於物件中的動態成員(堆或者其他系統資源),要重新分配動態空間。

當類不定義拷貝建構函式的時候,編譯器會自動生一個建構函式,叫做預設拷貝建構函式。預設拷貝建構函式使用淺拷貝方式。如果類中含有動態資料成員,就必須使用深拷貝方式實現拷貝建構函式,否則,在銷燬物件時,兩個物件的解構函式將對同一個記憶體空間釋放兩次,產生執行時錯誤。

程式碼:

class Experience
{
public:

	string timeArea;
	string company;

	void WorkExperience(string timeArea, string company)
	{
		this->timeArea = timeArea;
		this->company = company;
	}

};

class Resume
{
private:
	string name;
	string sex;
	string age;
	//string timeArea;
	//string company;


public:
	Experience *WorkExperience;

	Resume(string name)
	{
		this->name = name;
		WorkExperience = new Experience();
	}

	Resume(const Resume&C)
	{
		WorkExperience = new Experience();
		*WorkExperience = *WorkExperience;
		this->sex = C.sex;
		this->age = C.age;
		this->name = C.name;
	}


	void SetPersonalInfo(string sex, string age)
	{
		this->sex = sex;
		this->age = age;
	}

	void SetWorkExperience(string timeArea, string company)
	{
		WorkExperience->WorkExperience(timeArea, company);
		//this->timeArea = timeArea;
		//this->company = company;
	}

	void Display()
	{
		cout<<name<<" "<<sex<<" "<<age;
		cout<<endl;
		cout<<"工作經歷:"<<WorkExperience->timeArea<<"  "<<WorkExperience->company;
		cout<<endl;

	}

};




int main(void)
{
	Resume A("Rambo");
	A.SetPersonalInfo("M", "18");
	A.SetWorkExperience("2013","SQL");


	Resume B(A);
	B.SetWorkExperience("2014","C++");

	A.Display();
	B.Display();

	getchar();
	return 0;
}