GOF复合设计模式CompositeObject::删除C++中的递归实现
GOF Composite Design Pattern CompositeObject::Remove Recursive Implementation in C++
这是我在代码审查网站中提出的问题的一部分
用现代C++实现GOF复合设计模式
该帖子有关于它的完整信息/实施,但我在这里发布这个问题是为了了解以下信息:
How to implement CompositeEquipment::Remove?.
根据我的理解,它应该在客户端调用的所有复合对象和recursively all its child objects which can also be of composite type
中进行递归搜索。只是从上面的实现中举例说明,如果客户端将写为cabinet->Remove(bus)
;它不会移除总线对象,因为它是CCD_ 3对象的子对象。这对我来说似乎是不正确的。然而,我不能以递归搜索子对象本身是否为复合对象的方式来实现CompositeEquipment::Remove
。
到目前为止,我已经完成了以下实现,它只搜索客户端所涉及的Remove
方法的复合对象。
//To find out whether items are in the composite objects
class Name_Equal {
private:
Equipment::EquipmentSmartPtr val;
public:
Name_Equal(const Equipment::EquipmentSmartPtr& v) :val(v) { }
bool operator()(const Equipment::EquipmentSmartPtr& x) const {
return (x->Name() == val->Name());
}
};
void CompositeEquipment::Remove(EquipmentSmartPtr entry) {
find_equipment(_equipment, entry);
}
void CompositeEquipment::find_equipment(std::vector<EquipmentSmartPtr>& vec,
EquipmentSmartPtr& entry){
Name_Equal eq(entry);
auto itrpos = std::find_if(std::begin(vec), std::end(vec), eq);
if (itrpos != std::end(vec)) {
vec.erase(itrpos);
}
}
如果有任何额外的信息或完整的代码需要在这里发布,请告诉我。
有两个选项:
-
在基类中提供一个
virtual
函数Remove
,并使其成为noop实现。然后在CompositeEquipment::find_equipment
中再添加几行。void CompositeEquipment::find_equipment(std::vector<EquipmentSmartPtr>& vec, EquipmentSmartPtr& entry){ Name_Equal eq(entry); auto itrpos = std::find_if(std::begin(vec), std::end(vec), eq); if (itrpos != std::end(vec)) { vec.erase(itrpos); } else { for ( EquipmentSmartPtr sptr : vec ) { sptr->Remove(entry); } } }
-
使用
dynamic_cast
来确定组合的某个项是否也是组合。如果是,请拨打Remove
。我更喜欢这个选项。void CompositeEquipment::find_equipment(std::vector<EquipmentSmartPtr>& vec, EquipmentSmartPtr& entry){ Name_Equal eq(entry); auto itrpos = std::find_if(std::begin(vec), std::end(vec), eq); if (itrpos != std::end(vec)) { vec.erase(itrpos); } else { for ( EquipmentSmartPtr sptr : vec ) { Equipment* ptr = dynamic_cast<Equipment*>(sptr.get()); if ( ptr ) { ptr->Remove(entry); } } } }
关于名字。。。find_equipment
似乎是一个奇怪的函数名称。我会把整件事放在Remove
里。
void CompositeEquipment::Remove(EquipmentSmartPtr& entry){
std::vector<EquipmentSmartPtr>& vec = _equipment;
Name_Equal eq(entry);
auto itrpos = std::find_if(std::begin(vec), std::end(vec), eq);
if (itrpos != std::end(vec)) {
vec.erase(itrpos);
} else {
for ( EquipmentSmartPtr sptr : vec )
{
Equipment* ptr = dynamic_cast<Equipment*>(sptr.get());
if ( ptr )
{
ptr->Remove(entry);
}
}
}
}
相关文章:
- 如何在BST的这个简单递归实现中消除警告
- 使用非递归插入方法实现 AVL 树
- C++ 模板使用递归实现循环
- 了解使用堆栈实现队列的递归调用机制
- 在int main()[c++]中实现一个递归函数
- 链表中的递归长度函数实现
- 递归合并排序算法实现
- 我如何实现递归函数的模板,该模板允许C 中的许多不确定数据类型的参数
- 实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
- 我应该如何实现递归方法以找到在C++中形成最大堆的多种方法
- 在C++中树的递归实现中少出现1个节点
- 使用递归实现 pow(A, B) % C,其中 A、B 和 C 是正整数
- C++11 递归自旋锁实现
- 在 Matlab 中非递归实现 perms,与 Coder 兼容
- 使用递归函数实现 neper 数 (e)
- GOF复合设计模式CompositeObject::删除C++中的递归实现
- (C++)无递归实现指数函数计算器
- 归并排序递归实现的部分理解
- 迭代方法似乎比递归实现(硬币更换)慢
- 用堆栈而不是递归实现Lisp-eval