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(); }
  );
}