【问题标题】:How to call a function for specific objects in a C++ Array?如何为 C++ 数组中的特定对象调用函数?
【发布时间】:2019-05-27 02:17:09
【问题描述】:

我希望你能帮助我,因为我正在努力改进我的 C++ 继承概念。首先,我有以下对象层次结构:

具有两个子类的基类“Image”:PNG 和 JPG(每个都有自己的方法)。

我在 PNG 类中编写了一个方法,该方法(以模拟方式)删除 alpha 通道(它只是打印“已删除 Alpha 通道”)。

话虽如此,我想编写一个方法,该方法将一个包含许多指向图像对象(可以是 JPG 或 PNG)的指针的数组作为输入,并且只删除那些是 PNG 的 alpha 通道。由于在 C++ 中这不是一个好的做法,因此询问对象的类型(或者我相信),这是遍历图像数组的最佳方式(请记住,它可以用 PNG 或 JPG 对象填充)和仅删除 PNG 对象的 alpha 通道?我应该在哪个类中编写该方法?父母还是孩子?

希望我的解释正确,并在此先感谢您。

【问题讨论】:

  • 默认情况下不执行任何操作并在 PNG 子类中重新实现的虚拟方法。这就是虚方法的全部意义所在。
  • 请注意,您不能为此使用 objects 数组;你必须使用 pointers 的数组。
  • 你是对的,谢谢,我刚刚编辑了它:D @PeteBecker

标签: c++ inheritance methods hierarchy


【解决方案1】:

明显的实现是基类有一个用于删除 alpha 通道的虚拟方法,它是无操作的。 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();
}

【讨论】:

  • 非常感谢,很好的解释^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2015-08-31
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多