2017-07-02 5 views
-3

私は2分子の可能性を計算する必要がある物理プロジェクトシミュレーションに取り組んでいます。タイプが引数のときにtypeidを避ける方法

、これは私が書くために考えたコードの一部です:

class Molecule 
{ 
    public: 
    double someBulshit; 
    virutal double Potential(const Molecule & mol); 
} 

class LC : public Molecule 
{ 
    public: 
    virtual double Potential(const Molecule & mol) 
    { 
     if(typeid(mol) ==typeid(LC)) 
      return 1;// for the example 
     return 3; 
    } 

} 
class Col : public Molecule 
{ 
    public: 
    virtual double Potential(Molecule mol) 
    { 
     if (typeid(mol) == typeid(Col)) 
      return 2; 
     return 3; 
    } 
} 

    int main(int argc, char* argv[]) 
    { 
     Molecule mol1 = new Col(); 
     Molecule mol2 = new LC(); 

     double my_potential = mol1.Potential(mol2); 
     printf ("%f",my_potential); 
    } 

私はタイプIDを使用することは悪いことを聞いたが、私はそれを使用しなくてもそうする別の方法を見つける傾けます。 これはパフォーマンスにも影響され、typeididであると私は理解しました。

私は別の関数に分割してみました:

double Potential(const LC & mol); 
double Potential(const Col & mol); 

しかし、私は、多型と呼んでカント..

+3

これはC++コードではありません。 – juanchopanza

+0

私はそれをC# から変換しました。私はCPPで作業する必要があります。 しかし、その点は概念ではありません。 – pio

+0

この問題が継承によって解決される強い理由はありますか?異なるタイプの分子にIDを割り当ててから、潜在的な2次元テーブルを作成することができます。これはできるだけ速くなるでしょう。 – geza

答えて

1

あなたはダブルディスパッチのいくつかの種類が必要です。通常の推奨はVisitor Patternです。しかし、私はこの場合はお勧めしません。

私は分子の基底と派生したクラスを保つべきだと思います。 MoleculeクラスにIDを追加する必要があります。また、2つのオブジェクトのIDで索引付けされた2次元表を使用して2重ディスパッチを実装します。このように:

class Molecule { 
    private: 
    int m_id; 
    public: 
    Molecule(int id) : m_id(id) { } 

    int id() const { 
     return m_id; 
    } 
}; 

class LC: public Molecule { 
    private: 
    // members here 
    public: 
    LC() : Molecule(0) { } 
}; 

class Col: public Molecule { 
    private: 
    // members here 
    public: 
    Col() : Molecule(1) { } 
}; 

double potential_lc_vs_lc(const Molecule &a, const Molecule &b) { 
    const LC &lc_a = static_cast<LC &>(a); 
    const LC &lc_b = static_cast<LC &>(b); 
    // calculate potential LC (lc_a) vs LC (lc_b) here 
    return ...; 
} 

// all the potential_XX_vs_XX functions come here 

const double (*potentialCalculatorTable[2][2])(const Molecule &, const Molecule &) = { { potential_lc_vs_lc, potential_lc_vs_col }, ... }; 

double calculatePotential(const Molecule &a, const Molecule &b) { 
    return (*potentialCalculatorTable[a.id()][b.id()])(a, b); 
} 

これはいくつかの手動管理が必要ですが、解決策は明らかです(私の意見では)。

関連する問題