我最近在求職面試時,我的面試官的新對象給我,涉及不同形狀的序列化到一個文件中的建模問題。創建通過調用新構造函數的字符串
的任務是通過首先定義一個抽象名爲Shape類來實現的形狀像圓或矩形,然後通過從基類(形狀)繼承實現各種形狀(圓形,矩形。)。
每種形狀的兩種抽象方法是:read_to_file(應該從文件讀取形狀)和write_to_file,它應該將形狀寫入文件中。
所有的工作都是通過在繼承的形狀中實現該虛擬函數來完成的(例如:對於Circle我正在寫入半徑,對於正方形我保存了正方形的邊......)。
class Shape {
public:
string Shape_type;
virtual void write_into_file()=0;
virtual void read_into_files()=0;
Shape() {
}
virtual ~Shape() {
}};
class Square: public Shape {
public:
int size;
Square(int size) {
this->size = size;
}
void write_into_file() {
//write this Square into a file
}
void read_into_files() {
//read this Square into a file
}
};
這樣做是爲了看看我是否知道多態性。
但是,後來我被要求執行該採取的*shape
向量兩種功能和讀/寫它到一個文件中。
書寫的內容很簡單,去這樣的事情:
for (Shape sh : Shapes) {
s.write_into_file();
}
爲我想過在文本閱讀的第一個字的閱讀部分(我實現這樣的有這個文本文件中的序列化的文件線:Shape_type: Circle, Radius: 12; Shape_type:Square....
,所以第一句話說的形狀類型)。並將其保存到一個字符串,如:
string shape_type;
shape_type="Circle";
然後我需要創建一個特定形狀的新實例,我想的東西就像一個大的開關
<pre><code>
switch(shape_type):
{
case Circle: return new circle;
case Square: return new square
......
}
</pre></code>
然後,面試官告訴我認爲這個實現有一個問題,我認爲這是一個事實,即我們將在未來添加的每一個新形狀都應該更新int這個大的形狀。他試圖引導我進入設計模式,我告訴他,工廠設計模式可能會有所幫助,但我找不到擺脫這種轉變的方法。即使我將這個開關從功能移動到FactoryClass
我仍然必須使用開關來檢查形狀的類型(根據我從文本文件中獲得的字符串內容)。
我有,我從文件中讀取一個字符串,表示當前類型的形狀。我想做的事情如下:
string shape_type;
shape_type="Circle";
Shape s = new shape_type; //which will be like: Shape s = new Circle
但我不能在c + +中做到這一點。
對我應該做什麼有任何想法?
我如何製作這張地圖?寄存器是C++中的保留字嗎? – Matoy
我添加了一些代碼,並將其名稱更改爲'add',希望能夠使其更清晰。 – Sean
謝謝!這似乎是我的面試官所要面對的答案(在30分鐘的面試中......去圖)。無論如何,你的答案引導我到谷歌,我發現這篇文章:http://blog.fourthwoods.com/2011/06/04/factory-design-pattern-in-c/(這基本上更遠一點litlle多一點在你的右邊回答。謝謝。 – Matoy