2016-03-29 2 views
2

У меня есть следующие классы, связанные с математикой/геометрией: MathLine, MathPoint, MathVector, MathPlane.Литье родительского класса в детский класс, чтобы избежать избыточности

На каждом из них вы можете выполнять преобразования вращения и перевода. Поэтому я создал родительский класс с именем GeometricObject, объекты, которые могут быть преобразованы в геометрическое пространство.

Теперь я могу создавать чистые виртуальные функции класса с различными реализациями для каждого дочернего класса. Теперь, я хочу общую функцию, которая может принимать GeometricObject, но «шикарно» вернуть то, что тип я на самом деле положить в К примеру, у меня есть следующая функция, которая вращает Геометрический объект в другой системе координат:.

GeometricObject rotate_object_to_global_coordinate_system(GeometricObject object) { 
    object.rotateX(90); // Pure virtual functions 
    object.rotateY(90); 
    object.rotateZ(90); 

    return object; 
} 

Если я ввожу в него MathLine, я ожидаю, что функция будет «отлита» в MathLine, выполнит выполнение моих виртуальных функций MathLine и вернет MathLine.

Я искал везде для этого, и, похоже, это можно сделать, используя либо указатели (auto_ptr), либо литье (dynamic_cast). Это не кажется хорошим, потому что я читал, что это плохой способ сделать это, потому что он жертвует заметным количеством производительности. Это также похоже на простую функцию, которую должен иметь язык программирования высокого уровня. Это можно сделать?

Я думаю, для меня очень важно это сделать, потому что в противном случае мне пришлось бы писать отдельные функции, которые в основном выполняют одни и те же виртуальные функции для разных дочерних классов. Я должен был бы написать:

MathLine rotate_line_to_global_coordinate_system(MathLine object); 
MathPoint rotate_point_to_global_coordinate_system(MathPoint object); 
MathPlane rotate_plane_to_global_coordinate_system(MathPlane object); 
// etc. 

ответ

0

Для чего это за шаблоны. Предпочтительно, чтобы ваша функция вращения использовалась как шаблон, который может работать непосредственно в любом из ваших четырех подклассов.

Если это не осуществимо, другая, менее предпочтительная, но по-прежнему наиболее приемлемая опция - принять эту функцию вращения и обернуть ее внутри шаблона фасада, который пересылает свой параметр, затем берет возвращаемое значение из функции вращения, отбрасывает его на соответствующий тип, а затем возвращает его.

0

Пока ваши методы являются виртуальными в классе матерей, если вы их вызываете, он автоматически вызовет реализацию.
Ваш код может быть следующим:

class GeometricObject 
{ 
    virtual void rotateX(float angle) = 0; 
    virtual void rotateY(float angle) = 0; 
    virtual void rotateZ(float angle) = 0; 
}; 

Тогда любая функция наследования от этого класса должны иметь эти функции реализованы:

class MathLine : public GeometricObject 
{ 
    void rotateX(float angle) { /* Implementation */ } 
    void rotateY(float angle) { /* Implementation */ } 
    void rotateZ(float angle) { /* Implementation */ } 
}; 

Теперь, если вы звоните ваша функция rotate_object_to_global_coordinate_system и переходя к ней в MathLine, он автоматически называет его выполнение функций вращения.

И если вы будете следовать тем же правилам, и для других объектов, он будет делать то же самое для MathPoint, MathPlane и т.д.

+0

Я довольно уверен, что я проверил это, и это не работает. Вот почему я поставил этот вопрос в первую очередь. Тем не менее, я дважды проверю и дам вам знать. Спасибо! –

+0

@RandyArdywibowo Отправьте свой код, если вы хотите получить помощь непосредственно на нем. – Aracthor

Смежные вопросы