OOP设计 - 处理整个Foo对象序列

时间:2013-10-11 19:48:32

标签: c++ design-patterns opencv

我是面向对象设计的新手,我希望能就设计这个项目的更好方法获得一些建议。

我已经开始使用FooSequence类,它应该在向量中初始化并存储一系列Foo对象。我希望能够修改和删除此序列中的Foo对象。也就是说,应用许多算法来处理整个Foos序列,并从该序列中删除质量差的Foos。

我不确定如何将FooSequence与处理Foo对象的类联系起来。如果有人能详细说明相关的设计模式和陷阱,我将非常感激。

我想我可以:

a)扩展FooSequence的范围并重命名为FooProcessor,其中FooProcessor的成员函数将处理成员vSequence_

b)提供访问器和mutator函数以允许对Foo对象的读写访问。使用另一个类(FooProcessor)来修改和删除FooSequence中的Foo对象。我不确定这应该如何界面。

//A simplified header of the FooSequence class
class FooSequence {
public:
  FooSequence(const std::string &sequence_directory);
  ~FooSequence();

  //To process the sequence, another class must know the capacity of the vector
  //I'm not sure if interfacing to std::vector member functions makes much sense
  std::size_t getSize() const { return vSequence_.size(); }

  //Should I use an accessor that returns a non-const reference??
  //In this case, Why not just make the vector public?
  std::vector<std::shared_ptr<Foo>> getFoo;

  //Return a non-const reference to individual Foo in the sequence??
  //This doesn't help iterate over the sequence unless size of vector is known
  std::shared_ptr<Foo>& operator[] (std::size_t index) { 
  return vSequence_[index];
  }

private:
  const std::string directory_;
  std::vector<std::shared_ptr<Foo>> vSequence_;
  FooSequence(const FooSequence &);
  void operator=(const FooSequence &);
};

我试过通过GoF咨询设计模式,但我认为它对我来说太先进了。任何建议都将受到极大的赞赏。

编辑:虽然我认为这个问题应该有关于面向对象设计的一般答案,但我想我应该澄清一下我想要将ImageSequence类与OpenCV接口。我想知道我可以使用哪些策略或设计来最好地将ImageSequence与其他类接口

3 个答案:

答案 0 :(得分:2)

根据您在Foo对象上需要处理的处理类型,我认为只需将std::vector<std::shared_ptr<Foo>>与STL的标准算法调用相结合就足够了。

你可以用STL做很多事情:

  • 排序
  • 变换
  • 查找
  • 重新排列
  • 等...

所有这些算法都可供std::vector使用,因为标准容器和算法可以协同工作。

查看cppreference的算法列表:

STL alrogithm reference

一般设计指南(响应您的修改)

保持简单。您的设计越简单,维护程序就越容易。如果您的图像序列可以表示为简单的矢量,请执行此操作。然后,您可以通过迭代图像并处理它们,让其他函数/类对该向量进行操作。

这里有一个简单的工作范围:

for (auto& myImage: myImageVector) {
    // Process my image here
}

答案 1 :(得分:1)

for_each是一个允许您将自定义函数应用于容器中每个元素的构造。

例如在您的情况下:

myCustomFunction ( Foo& fooObj)
{
    //do something with the foo object
}

现在你可以打电话了

for_each(vSequence_.begin(),vSequence_.end(),myCustomFunction)

此语句将对序列中的每个元素执行myCustomFunction

这不是每个人的设计建议,但在您的观点a中,只要对所有对象进行批处理,A FooProcessor就可以使用for_each

答案 2 :(得分:1)

我怀疑,你根本不需要那门课。

在现实生活中,你有一个vector<Mat>(不是vector<shared_ptr<Mat>>,因为Mat已经充当了智能指针),并称之为一天。