Как вызвать функцию для конкретных объектов в массиве C ++? - PullRequest
0 голосов
/ 29 декабря 2018

Я надеюсь, что вы можете мне помочь, потому что я пытаюсь улучшить мои концепции наследования C ++.Прежде всего, у меня есть следующая иерархия объектов:

Базовый класс "Image" с двумя дочерними классами: PNG и JPG (каждый со своими методами).

Я написал метод внутриКласс PNG, который (имитируется) удаляет альфа-канал (он просто печатает «Альфа-канал удален»).

При этом я хочу написать метод, который принимает массив из множества указателей на объекты изображения (может быть либо JPG или PNG) в качестве входных данных, и удаляет альфа-канал только тех, которые являются PNG.Поскольку в C ++ не рекомендуется задавать тип объекта (или, как я полагаю), это лучший способ перебрать массив изображений (помня, что он может быть заполнен объектами PNG или JPG) иудалить альфа-канал только из объектов PNG?В каком классе я должен написать этот метод?Родитель или ребенок?

Надеюсь, я все правильно объяснил, и заранее большое спасибо.

1 Ответ

0 голосов
/ 29 декабря 2018

Очевидная реализация состоит в том, что в базовом классе есть виртуальный метод для удаления альфа-канала, который является недопустимым.Класс PNG наследует от Image и переопределяет эту функцию-член.

class Image
{
public:
    virtual void DeleteAlphaChannel() {};
};


class PNG : public Image
{
   void DeleteAlphaChannel() override
   {
      cout << "Alpha Channel deleted" << endl;
   }
};

Затем вспомогательная функция, которая принимает массив из указателей на изображения , следовательно, Image**

void DeleteAlphaChannelsFromArrayOfObjects(Image** imageList, int count)
{
    for (int i = 0; i < count; i++)
    {
        imageList[i]->DeleteAlphaChannel();
    }
}

И соответствующий пример кода.

{
    PNG pngFile("foo.png");
    JPG jpgFile("bar.jpg");

    Image* imageList[2] = {&pngFile, &jpgFile};
    DeleteAlphaChannelsFromArrayOfObjects(imageList, 2);
}

Вы также можете сделать реализацию в векторном стиле:

void DeleteAlphaChannelsFromArrayOfObjects(std::vector<Image*>& imageList)
{
    for (Image* pImage : images)
        pImage->DeleteAlphaChannel();
}
...