2

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

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

我不确定我应该如何将 FooSequence 与处理 Foo 对象的类接口。如果有人能详细说明相关的设计模式和陷阱,我将不胜感激。

我想我可以:

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

b) 提供访问器和修改器函数以允许对 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 与其他类接口

4

3 回答 3

2

根据您需要对您的 Foo 对象进行何种处理,我相信只需std::vector<std::shared_ptr<Foo>>结合来自 STL 的标准算法调用的简单方法就足够了。

您可以使用 STL 做很多事情:

  • 种类
  • 转换
  • 寻找
  • 改编
  • ETC...

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

查看 cppreference 中的算法列表:

STL 算法参考

一般设计指南(响应您的编辑)

把事情简单化。你的设计越简单,你的程序就越容易维护。如果您的图像序列可以表示为一个简单的矢量,那就去做吧。然后,您可以通过迭代图像并处理它们来让其他函数/类对该向量进行操作。

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

for (auto& myImage: myImageVector) {
    // Process my image here
}
于 2013-10-11T19:57:44.267 回答
1

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

例如在你的情况下:

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

现在你可以打电话了

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

该语句将myCustomFunction针对序列中的每个元素执行。

这不是每个 say 的设计建议,但在您的观点 a 的上下文中,AFooProcessor可以for_each在所有对象需要批处理时使用。

于 2013-10-11T20:19:23.277 回答
1

我怀疑,你是否需要那门课。

在现实生活中,您将拥有 a vector<Mat>(不是 a vector<shared_ptr<Mat>>,因为 Mat 已经充当智能指针)并收工。

于 2013-10-13T08:26:31.213 回答