2012-12-26 17 views
-2

哪一個是最好的方法來實現幾個訂單關係只有一個類?我對Strategy Pattern有個想法,但我不確定這是個好主意。如果沒有最好的辦法,爲什麼?爲一個類實現幾個順序關係?

+3

你的問題太含糊。你能詳細說明嗎?一個簡單的例子會很好 – DarthVader

+0

對於這個問題,「最好」對你來說意味着什麼? – Caleb

+0

我之前做過一些Java。我們可以使用CompareTo或Comparator。我想知道如何用C++工具模擬比較器的行爲。 – Saroupille

回答

1

創建一個仿函數類並使用您想要使用的順序關係初始化一個成員。有operator()使用該成員來決定兩個操作數的順序。

class Ordering 
{ 
public: 
    Ordering(int method) : _method(method) {} 
    bool operator()(const MyObject & first, const MoObject & second) const 
    { 
     switch(_method) 
     { 
      case 0: 
       return first.name < second.name; 
      case 1: 
       return first.age < second.age; 
      // ... 
     } 
    } 
    int _method; // an enum would be better 
}; 

std::sort(myobjs.begin(), myobjs.end(), Ordering(selected_method)); 
+0

感謝您的回答! – Saroupille

0

我認爲戰略是這裏一個更好的辦法,我不是很肯定的開關結構是一個好主意(想象一下,在一個開關......太重1000個比較方法,是不是?)

所以讓A,一個需要方法比較的類。

我建議爲每個方法創建一個類,該實例將是A的組件。

例如:

class A{ 
    private: 
    //Some attributes 
    Comparator<A> comp_; 

    public: 
    //Some methods (including constructor) 
    bool operator()(const MyObject & first, const MoObject & second) const 
    { 
     return comp_.compare(first,second); 
    } 
    void setComparator(Comparator<A>& comp){ 
     comp_ = comp; 
    } 
} 


//Forgot the syntax about template. So there is a template with one parameter 
class Comparator{ 
    public: 
    //Constructor 

    //To overwrite on subclasses 
    virtual bool compare(T& first, T& second) = 0; 


} 

通過這種結構,可以方便地添加一個方法,不用修改,只需設置在程序執行的任何時刻的正確比較。

相關問題