2013-04-06 3 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; 
} 

ошибку является: Множественные маркеры на этой линии - ' фильтр2 'не был объявлен в этом scope - Функция' filter2 'не может быть разрешено

Где я делаю неправильно? Функция filter2 возвращает DynamicVector, поэтому я не понимаю, почему она не работает.

+1

Это не работает, потому что у вас есть 'Controller :: filter2', а не только' filter2'. Я уверен, что этот код не будет использоваться, чтобы выписывать лекарства для реальных людей. – lapk

+0

Помимо острой проблемы у вас есть, все «новые» вещи придут к вам с утечками памяти, особенно при наличии исключений. Это не Java, у которого есть сбор мусора, но C++, который требует от вас использования интеллектуальных указателей для получения аналогичного поведения. Однако вместо указателей предпочтительным является использование простых объектов. Кроме того, вы выбрасываете преимущества проверки целостности компилятора const-correctness. –

ответ

1

Потому что filter2's заявление и его реализация отличается.

Посмотрите, как вы прототипируете его в строке 2 и как вы его реализуете. Filter2 должен быть объявлен как часть области Controller или как часть глобальной области, а не для обоих.

+0

Я делаю модульную программу. Объявление filter2 находится в контроллере.h и реализация в контроллере.cpp – user1849859

+1

@ user1849859 Это не имеет значения. Вы * можете * разделить их на заголовок и файл реализации, но вам еще нужно объявить функцию внутри класса 'Controller'. –

+0

@ KonradRudolph И как именно я это делаю? Я действительно не получаю это – user1849859

Смежные вопросы