2012-07-23 72 views
0

我有一個基類Shape和其它派生類CircleSquareTriangle。我創建了三個基類指針的向量。排序對象的輸入陣列中的C++

vector < Shape * > shapes(3); 
shapes[ 0 ] = &C1; //Circle C1; 
shapes[ 1 ] = &S1; //Square S1; 
shapes[ 2 ] = &T1; //Triangle T1; 

之後,我使用的loop調用virtualViaPointer()將調用虛擬函數draw()

for (size_t i = 0; i < shapes.size(); ++i) { 
    cout << endl; 
    virtualViaPointer(shapes[ i ]); 
} 

void virtualViaPointer(const Shape * const baseClassPtr) 
{ 
baseClassPtr->draw(); 
} 

每個派生類具有如下功能:getArea(),計算每一形狀的區域並返回結果。

現在,我想通過使用上面的vector來排序區域,並調用getArea()函數。我怎樣才能做到這一點? 例如,我的排序函數應該是這樣的sortShape(Array, numShape),其中Array是指向創建的形狀的指針的數組Shape

任何幫助理解

回答

3

可以使用std::sort用合適的比較函數:

bool compareArea(const Shape* lhs, const Shape* rhs){ 
    return lhs->getArea() < rhs->getArea(); 
} 

... 

std::sort(shapes.begin(), shapes.end(), compareArea); 
1

使用排序算法與用戶定義的分類準則,例如

std::sort(shapes.begin(), shapes.end(), [](Shape * lhs, Shape * rhs) 
{ 
    return lhs->getArea() < rhs->getArea(); 
}); 
+0

這是很酷,但請注意,它需要一個現代的編譯器。 – Kos 2012-07-23 09:48:36

+3

這將是很好的陳述,使用lambda函數只支持C++ 11。 – betabandido 2012-07-23 09:48:55