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)を使用することは悪い習慣と考えられているため、上記の2つのように、キャスティングよりも多くのOOソリューションを常に検索してください。

于 2012-12-02T20:07:16.843 に答える
0

Off the top of my head, a simple solution would be to have a function in the base class, that returns an int signifying which class it is. And in each of the derived classes, override this function to return different values. You could use that value to determine which class is being stored in the vector

Edit: And Generally class specific details are to be left in the class, which is the point of polymorphism. Try to do the derived class specific calculations as an overided member function within each class, and use that just to fetch the value forgoing the need for large for loops (for each new derived class) outside.

于 2012-12-02T19:34:08.610 に答える