我是面向对象设计的新手,我希望能就设计这个项目的更好方法获得一些建议。
我已经开始使用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与其他类接口
答案 0 :(得分:2)
根据您在Foo对象上需要处理的处理类型,我认为只需将std::vector<std::shared_ptr<Foo>>
与STL的标准算法调用相结合就足够了。
你可以用STL做很多事情:
所有这些算法都可供std::vector
使用,因为标准容器和算法可以协同工作。
查看cppreference的算法列表:
一般设计指南(响应您的修改)
保持简单。您的设计越简单,维护程序就越容易。如果您的图像序列可以表示为简单的矢量,请执行此操作。然后,您可以通过迭代图像并处理它们,让其他函数/类对该向量进行操作。
这里有一个简单的工作范围:
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已经充当了智能指针),并称之为一天。