2017-07-02 51 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); 
    } 

聽說使用typeid的是不好的,但我不能找到另一種方式,而無需使用它這樣做。 這也是性能敏感和typeid我知道typeid不推薦與它。

我試圖拆分到不同的功能:

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

但是,我不能叫他們多態..

+3

這不是C++代碼。 – juanchopanza

+0

我將它從C# 轉換而來,我需要它在CPP上工作。 但重點不在於它是這個概念的語言。 – pio

+0

有沒有強烈的理由,這個問題可以通過繼承來解決?您可以將ID分配給不同類型的分子,然後創建一個潛在的2D表格。這將盡可能快。 – geza

回答

1

你需要某種雙重分派的。這裏通常的建議是Visitor Pattern。但是,在這種情況下,我不推薦它。

我想,你應該保留分子基礎和派生類。您應該在分子類中添加一個ID。並用2個對象的ID進行索引,實現帶有2D表格的雙重調度。像這樣:

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

這需要一些手動管理,但解決方案很明確(在我看來),而且速度很快。