Использование new с указателем базового класса для создания объекта производного класса - PullRequest
0 голосов
/ 28 апреля 2020

Меня интересует, есть ли лучший способ динамически создавать объекты из указателя базового класса. Вот пример моей ситуации:

// У меня есть массив указателей базового класса типа квадрат. Коробка получена из квадрата. Сначала я создаю новый объект-бокс с параметрами params с новым, используя квадратный указатель.


32     square * sqr_arr[10];
33     
34     square * a_square;
35     
36     a_square = new box(arr, 4, 5, 7);
37 
38     box * temp = dynamic_cast<box *>(a_square);
39 
40     sqr_arr[0] = new box(*temp);
41     
42     sqr_arr[0]->display();

Моя проблема в том, что в моей настоящей программе я постоянно перемещаю указатели в массиве на основе сортировки по AZ, но я Я испытываю трудности с тем фактом, что каждый раз, когда мне нужно знать, какой производный класс я буду создавать вместо указателя, «зная», на что он указывает, и создавая объект этого типа.

Скажем, в Код выше я хотел переместить sqr_arr [0] в sqr_arr [1]. Есть ли в любом случае sqr_arr [1] сможет просто сделать копию с правильным использованием новой. Например, в моей настоящей программе sqr_arr может создавать много разных объектов, поэтому мое единственное решение - перебирать с помощью dynamic_cast, пока он не вернет приемлемый указатель на производную * temp. Это хорошее решение или его можно было бы разработать в по-другому?

1 Ответ

0 голосов
/ 28 апреля 2020

Вам необходимо реализовать метод виртуального клона в вашем классе square, который box и другие производные классы могут переопределять, например:

class square
{
public:
    virtual square* clone() = 0;
};

class box : public square
{
public:
    square* clone() override { return new box(*this); }
};

...

square* sqr_arr[10];

sqr_arr[0] = new box(arr, 4, 5, 7);
...
sqr_arr[1] = sqr_arr[0];
sqr_arr[0] = sqr_arr[1]->clone();
sqr_arr[0]->display();
...