2013-04-06 164 views
1

我想做一個更通用的過濾器,所以我用typedef定義了一個指向函數的指針。但是我在DynamicVector * filterByQuantity(int quantity)函數中收到錯誤。這是什麼,我試圖做全碼:函數無法解析C++

或者Controller.h

typedef int (*filterFunc)(Medicine* criteria, Medicine*); 
DynamicVector<Medicine>* filter2(Medicine* criteria, filterFunc f); 

controller.cpp

#include "controller.h" 

int filterByQuantityLess(Medicine* criteria, Medicine* p) { 
    if (criteria->getQuantity() > p->getQuantity()) { 
     return 0; 
    } 
    return 1; 
} 

DynamicVector<Medicine>* Controller::filter2(Medicine* criteria, filterFunc f){ 
    DynamicVector<Medicine>* medList = repo->getAll(); 
    DynamicVector<Medicine>* rez = new DynamicVector<Medicine>(); 
    for(int i=0; i < medList->getLen(); i++){ 
     Medicine* m = new Medicine(medList->getElementAtPosition(i)); 
     if(!f(criteria, m)){ 
      rez->addElement(*m); 
     } 
    } 
    return rez; 
} 

DynamicVector<Medicine>* filterByQuantity(int quantity){ 
    Medicine* criteria = new Medicine(1,"",1,quantity); 
     DynamicVector<Medicine>* rez = filter2(criteria, filterByQuantityLess); //error 

    return rez; 
} 

錯誤的是:在這行 多個標記 - 「 filter2'未在此 範圍內聲明 - 函數'filter2'不能被解析爲

我在哪裏做錯了? filter2函數返回一個DynamicVector,所以我不明白爲什麼它不起作用。

+1

它不起作用,因爲你有'Controller :: filter2',而不僅僅是'filter2'定義...我當然希望這個代碼不會被用來爲真正的人開藥。 – lapk 2013-04-06 11:17:28

+0

除了您遇到的嚴重問題之外,所有「新」內容都會隨着內存泄漏而出現,尤其是在出現異常情況時。這不是Java,它有一個垃圾收集,但是C++要求你使用智能指針來獲得類似的行爲。除了指針之外,使用普通對象更可取。此外,您正在拋棄編譯器檢查const正確性的好處。 – 2013-04-06 12:08:58

回答

1

因爲filter2的聲明及其實施的不同。

看看你如何在第2行進行原型設計以及如何實現它。 Filter2應作爲Controller作用域的一部分或作爲全局作用域的一部分聲明,而不是兩者。

+0

我在做一個模塊化程序。 filter2的聲明位於controller.h中,並在controller.cpp中執行 – user1849859 2013-04-06 11:31:24

+1

@ user1849859這是無關緊要的。你可以將它們分離成頭文件和實現文件,但是你仍然需要在Controller類中聲明這個函數。 – 2013-04-06 11:33:30

+0

@KonradRudolph我該怎麼做?我真的不明白 – user1849859 2013-04-06 11:36:06