所以,按照同一個想法,我將先以一個C函數處理這件工作。
先寫測試:
TEST (NameDec, sort){
Department cs("Computer Science","CS");
Student mary("Alan","U20130003", &cs);
Student john("Betty","U20130002", &cs);
Student paul("Carol","U20130001", &cs);
vector<Student *> stus(cs.students());
sort (stus.begin(),stus.end(),nameDec);
CHECK(string("Carol")==stus[0]->name());
CHECK(string("Betty")==stus[1]->name());
CHECK(string("Alan")==stus[2]->name());
}
需要寫Department::students、Student::name、nameDec等函數,其中:
bool nameDec(Student *s1, Student * s2){
return s1->name() > s2->name();
}
為了強調這個函數用於依姓名排序Student,可將它定義為Student的member function。如宣告成一般 method,則需透過
Student物件才能找到這個函數:
Student s(...);
sort (stus.begin(),stus.end(), s.nameDec);
邏輯上有些怪。解決的作法是將它定義成static member function:
class Student {
public:
...
static bool nameDec(Student *s1, Student * s2){...}
};
static 的意義是宣告nameDec為Student class共用。static函數無法取用 instance variable或呼叫非static 之 member function(原因與 this 有關)。
如此,可直接使用該函數
sort (stus.begin(),stus.end(),Student::nameDec);
學習議題: static member function。
沒有留言:
張貼留言