我正在开发一个C ++项目,专门实现一个分流码算法。
我有一个函数可以创建一个超类型shared_ptr
的向量,但是被推入这个向量的类都是基类shared_ptr
。
然后我需要使用这个向量并将其传递给另一个函数,并在for循环中为向量的每个元素执行不同的逻辑。但是,我执行的逻辑取决于向量的每个元素中存在哪个基类。
基本上我不知道的是如何识别向量的每个元素中的哪种类型的基类。当我调试时,它们都是超类型的。
所以我一般都喜欢做这样的事情:
if(vectorElement == baseClass)
{
//do some logic
}
或者如果有一些不同的方法可以解决这个问题,我很想知道这一点。
答案 0 :(得分: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*/);
其他更复杂的解决方案是使用visitor pattern。
使用强制转换(dynamic_cast)被认为是一种不好的做法,所以总是要搜索比投射更多的OO解决方案,就像我上面提到的这两个。
答案 1 :(得分:0)
在我的脑海中,一个简单的解决方案是在基类中有一个函数,它返回一个表示它是哪个类的int。在每个派生类中,重写此函数以返回不同的值。您可以使用该值来确定向量中存储的类
编辑:通常,类特定的细节将保留在类中,这是多态的要点。尝试将派生类特定的计算作为每个类中的重写成员函数,并使用它只是为了获取在外面需要大型for循环(对于每个新派生类)的值。