Недавно я был на собеседовании, и мой интервьюер дал мне модельный вопрос, который включал сериализацию различных фигур в файл.Создание нового объекта путем вызова нового конструктора со строкой
Задача состояла в том, чтобы реализовать фигуры, такие как круг или прямоугольники, сначала определяя абстрактный класс с именем Shape, а затем реализуя различные формы (круг, прямоугольник ..), наследуя от базового класса (Shape).
Два абстрактных метода для каждой формы: read_to_file (который должен был читать форму из файла) и write_to_file, который должен был записать фигуру в файл.
Все было выполнено путем реализации этой виртуальной функции в унаследованной форме (пример: для круга я писал радиус, для квадрата я сохранил сторону квадрата ....).
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, что большой swicht. он пытается направить меня в шаблон дизайна, я сказал ему, что, возможно, шаблон дизайна завода поможет, но я не мог найти способ избавиться от этого переключателя. даже если я переведу переключатель из функции в 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-минутном интервью .. go figure). в любом случае, ваш ответ привел меня к Google, и я нашел эту статью: http://blog.fourthwoods.com/2011/06/04/factory-design-pattern-in-c/ (которая в основном более подробно освещена на вашем правом ответ. – Matoy