最佳实践:在具有不同成员变量和方法的向量中访问派生类

时间:2016-03-24 20:05:48

标签: c++ polymorphism

我有一些类StreetStreetlampHouseTree等等,这些类派生自基类AbstractClass。这两个类都有一组Instruction类型的不同成员变量,它们表示如何构建/植物"房子,树或灯。例如:

class House : public AbstractClass {
public:
  Instruction foundation;
  Instruction walls;
  Instruction roof;
};

class Tree : public AbstractClass {
public:
  Instruction hole;
};

包含不同对象的容器vector<AbstractClass*>将传递给第三个类Builder,该类应使用元素中包含的指令来构建&#34;他们按顺序。 Builder可以有一个方法void buildElement(AbstractClass*),根据说明,必须执行不同的操作(&#34;挖掘&#34;,&#34;种植&#34;,&#34;驾驶&#34;)< / p>

目前我只使用一个类,它包含大量(不必要的)信息,包括每个对象中的enum type以指定它具有的类型。 如何在C ++中有效地实现这种多态性的情况? 访客模式在这里适用吗?或者我应该使用像dynamic_casttypeid这样的RTTI机制。或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

Build()添加抽象AbstractClass方法,其中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可以遍历每个对象上的vector调用Build()

void Builder::buildElements(std::vector<AbstractClass*> &elements) {
  for(std::vector<AbstractClass*>::iterator i = elements.begin(); i != elements.end(); ++i) {
    i->Build();
  }

或者:

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