2

我正在做一个 C++ 项目,专门实现一个调车场算法。

我有一个函数可以创建一个shared_ptr超类类型的向量,但是被推入这个向量的类都是基类shared_ptr

然后我需要获取这个向量并将其传递给另一个函数,并在 for 循环中对向量的每个元素执行不同的逻辑。然而,我执行的逻辑取决于向量的每个元素中存在哪个基类。

所以基本上我不知道的是如何识别向量的每个元素中的基类类型。当我调试它们时,它们都以类型超类的形式出现。

所以一般我想做这样的事情:

if(vectorElement == baseClass)
{
  //do some logic
}

或者,如果有一些我想念的执行此操作的不同方法,我将有兴趣执行此操作。

4

2 回答 2

2

您的问题有很多解决方案,坦率地说,这是 OOP 中几乎最常见的问题。

最明显的是虚函数在不同的类中做不同的事情:

class SuperClass {
public:
   virtual void doSomething(/*someArgsIfNeeded*/) {
      // some base implementation, possible empty
      // or just use pure virtual function here
   }
};

class SubClass : public SuperClass {
public:
   virtual void doSomething(/*someArgsIfNeeded*/) {
      // some base implementation
   }
};

然后按如下方式使用它:

int SomeArgs;
std::vector<std::shared_ptr<SuperClass>> objects;
for (auto it = objects.begin(); it != objects.end(); ++i)
  it->doSomething(/*someArgsIfNeeded*/);

其他更复杂的解决方案是使用访问者模式


使用强制转换 (dynamic_cast) 被认为是一种不好的做法,因此始终寻找比强制转换更多的 OO 解决方案,就像我在上面介绍的这两个一样。

于 2012-12-02T20:07:16.843 回答
0

在我的脑海中,一个简单的解决方案是在基类中有一个函数,它返回一个 int 表示它是哪个类。并且在每个派生类中,重写此函数以返回不同的值。您可以使用该值来确定哪个类存储在向量中

编辑:通常类的具体细节将留在类中,这是多态性的重点。尝试将派生类特定的计算作为每个类中的覆盖成员函数进行,并使用它来获取值,而不需要在外部进行大型 for 循环(对于每个新的派生类)。

于 2012-12-02T19:34:08.610 回答