2013-06-16 3 views
0

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

Скажем, у нас есть класс с именем Shape, а другой, его подкласс, называемый Прямоугольник. Я хочу, чтобы функция работала для любая форма. Это возможно? Я думал, что смогу сделать что-то похожее на то, что вы видите ниже, но он разбивает игру, если я не изменю первый параметр, чтобы взять массив Rectangles.

void shift_shapes(Shape *shapes, int num_shapes, int x_offset, int y_offset) 
{ 
    for (int i = 0; i < num_shapes; i++) 
     shapes[i].move(x_offset, y_offset); 
} 

Rectangle rects[100]; 
// *Add 100 rectangles* 
shift_shapes(rects, 100, 10, 5); 

Спасибо за помощь!

+2

http://www.parashift.com/c++-faq-lite/array-derived-vs-base.html – catscradle

ответ

1

Array не содержит полиморфизм, вы можете архивировать его, используя вектор указателей и передать ссылку на вектор в функцию. Что-то вроде:

#include <memory> 
#include <vector> 

void shift_shapes(std::vector<std::unique_ptr<Shape> >& shapes, int num_shapes, int x_offset, int y_offset) 
{ 
    for (int i = 0; i < num_shapes; i++) 
    { 
     shapes[i].move(x_offset, y_offset); 
    } 
} 
+0

ли это на самом деле лучше (более прагматичные и читаемые) в этом случае просто сделать отдельные функции для разных типов фигур? Я чувствую, что это общая проблема ООП, и я думаю, странно, что вам нужно прыгать через обручи, чтобы это сделать. – ICoffeeConsumer

+1

Вам не нужно отделять функции, функция шаблона будет работать отлично. – billz

+0

Я ценю вашу помощь – ICoffeeConsumer