C++ 最佳实践:访问向量中具有不同成员变量和方法的派生类
我有一些类C++ 最佳实践:访问向量中具有不同成员变量和方法的派生类,c++,polymorphism,C++,Polymorphism,我有一些类Street,Streetlamp,House和Tree等等,它们是从基类AbstractClass派生的。这两个类都有一组不同类型的成员变量指令,表示如何“建造/种植”房屋、树木或灯具的指令。例如: class House : public AbstractClass { public: Instruction foundation; Instruction walls; Instruction roof; }; class Tree : public Abstract
Street
,Streetlamp
,House
和Tree
等等,它们是从基类AbstractClass
派生的。这两个类都有一组不同类型的成员变量指令
,表示如何“建造/种植”房屋、树木或灯具的指令。例如:
class House : public AbstractClass {
public:
Instruction foundation;
Instruction walls;
Instruction roof;
};
class Tree : public AbstractClass {
public:
Instruction hole;
};
包含不同对象的容器vector
被传递给第三类Builder
,该类应使用元素中包含的指令按顺序“构建”它们。生成器可以有一个方法void buildElement(AbstractClass*)
,并且根据指令必须执行不同的操作(“挖掘”、“种植”、“驾驶”)
目前我只使用了一个类,它保存了很多(不必要的)信息,包括每个对象中的enum type
,以指定它拥有的类型。
如何在C++中有效地实现多态性的情况?
访客模式在这里适用吗?或者我应该使用RTTI机制,比如
dynamic\u cast
和typeid
。或者有更好的方法吗?在AbstractClass
中添加一个抽象Build()
方法,其中AbstractClass
的每个派生函数根据需要实现Build()
:
class AbstractClass {
public:
virtual ~AbstractClass() {}
virtual void Build() = 0;
};
class House : public AbstractClass {
public:
Instruction foundation;
Instruction walls;
Instruction roof;
virtual void Build() {
// build foundation, walls, and roof as needed...
}
};
class Tree : public AbstractClass {
public:
Instruction hole;
Instruction plant;
virtual void Build() {
// dig hole and plant tree as needed...
}
};
然后Builder
可以在每个对象上调用Build()
的向量中循环:
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
for(std::vector<AbstractClass*>::iterator i = elements.begin(); i != elements.end(); ++i) {
i->Build();
}
void生成器::buildElements(std::vector和elements){
for(std::vector::iterator i=elements.begin();i!=elements.end();+i){
i->Build();
}
或:
void buildElement(AbstractClass*元素){
元素->构建();
}
void生成器::buildElements(标准::向量和元素){
std::for_each(elements.begin()、elements.end()、&buildElement);
}
或:
void生成器::buildElements(std::vector和elements){
std::for_each(elements.begin()、elements.end(),
[](抽象类*元素){element->Build();}
);
}
面向对象编程显然不能解决您的问题。您没有抽象的行为,只有不同的数据,因此没有有效的方法应用面向对象多态性。嗯,House
和Tree
的语义关系是什么?也许您应该更详细地描述您的用例举例说明,并给出您认为AbstractClass
应该是什么样子的示例。
void buildElement(AbstractClass* element) {
element->Build();
}
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
std::for_each(elements.begin(), elements.end(), &buildElement);
}
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
std::for_each(elements.begin(), elements.end(),
[](AbstractClass* element) { element->Build(); }
);
}