2013-04-21 3 views
0

ребята! Я пытаюсь сделать некоторые тесты, используя утверждения, и я хотел создать InMemoryRepository, но получаю сообщение об ошибке. Это то, что я хочу сделать:проблема с виртуальными методами в C++

void TestCaseMedicineInMemoryRepository::setUp(){ 
    this->medRepo = new MedicineInMemoryRepository(); //error 
} 

ошибки:

Multiple markers at this line 
    - The type 'MedicineInMemoryRepository' must implement the inherited pure virtual method 'MedicineInMemoryRepository::Save' 
    - The type 'MedicineInMemoryRepository' must implement the inherited pure virtual method 'MedicineInMemoryRepository::getAll' 
    - The type 'MedicineInMemoryRepository' must implement the inherited pure virtual method 
    'MedicineInMemoryRepository::findMedicineById' 
    - The type 'MedicineInMemoryRepository' must implement the inherited pure virtual method 
    'MedicineInMemoryRepository::deleteMedicine' 
    - The type 'MedicineInMemoryRepository' must implement the inherited pure virtual method 
    'MedicineInMemoryRepository::updateMedicine' 

виртуальный medicineRepository:

class MedicineRepository{ 
public: 
    virtual void Save(Medicine* m) throw (RepositoryException) = 0; 
    virtual void deleteMedicine(int ID) throw (RepositoryException) = 0; 
    virtual void updateMedicine(Medicine* m) throw (RepositoryException) = 0; 
    virtual List<Medicine*> getAll()=0; 
    virtual Medicine* findMedicineById(int ID)=0; 
}; 

InMemoryRepository.h:

#include "medicineRepository.h" 

class MedicineInMemoryRepository : public MedicineRepository{ 
protected: 
    List<Medicine*> medList; 
public: 
    MedicineInMemoryRepository(); 
    virtual ~MedicineInMemoryRepository(); 
    void Save(Medicine* m) throw (RepositoryException) = 0; 
    void deleteMedicine(int ID) throw (RepositoryException) = 0; 
    void updateMedicine(Medicine* m) throw (RepositoryException) = 0; 
    //int containsName(string name)=0; 
    List<Medicine*> getAll()=0; 
    //int updateQuantity(Medicine* m) throw (RepositoryException) = 0; 
    Medicine* findMedicineById(int ID)=0; 
}; 

InMemoryRepository.cpp:

#include "InMemoryRepository.h" 

MedicineInMemoryRepository::MedicineInMemoryRepository(){ 
} 


MedicineInMemoryRepository::~MedicineInMemoryRepository(){ 
    for(int i=0; i < medList.getLen(); i++){ 
     delete medList.getElement(i); 
    } 
} 

Medicine* MedicineInMemoryRepository::findMedicineById(int ID){ 
    for(int i=0; i < this->medList.getLen(); i++){ 
     Medicine* m = medList.getElement(i); 
     if(m->getID()==ID){ 
      return m; 
     } 
    } 
    return NULL; 
} 

List<Medicine*> MedicineInMemoryRepository::getAll(){ 
    return medList; 
} 

void MedicineInMemoryRepository::Save(Medicine* m) throw (RepositoryException){ 
    Medicine* med = findMedicineById(m->getID()); 
    if(med != NULL){ 
     medList.addElement(medList.getLen(), new Medicine(*m)); 
    } 
    else{ 
     throw RepositoryException("There is a medicine with the given ID!"); 
    } 
} 

void MedicineInMemoryRepository::deleteMedicine(int ID) throw (RepositoryException){ 
    int i=0; 
    while(i < medList.getLen() && medList.getElement(i)->getID()!=ID){ 
     i++; 
    } 
    if(i < medList.getLen()){ 
     Medicine* m = medList.deleteElementAtPos(i); 
     delete m; 
    } 
    else{ 
     throw RepositoryException("There is no medicine with the given ID"); 
    } 
} 

void MedicineInMemoryRepository::updateMedicine(Medicine* m) throw (RepositoryException){ 
    Medicine* med = findMedicineById(m->getID()); 
    if (med != NULL){ 
     m->setQuantity(med->getQuantity()); 
     m->setName(med->getName()); 
    //   this->medList->getElementAtPosition(pos).setConcentration(m.getConcentration()); 
     deleteMedicine(med->getID()); 
     Save(m); 
    } 
} 

Что я делаю неправильно, что получаю вышеуказанную ошибку? Я думал около 3 часов, и я не понимаю!

ответ

4
void Save(Medicine* m) throw (RepositoryException) = 0; 
    void deleteMedicine(int ID) throw (RepositoryException) = 0; 
    void updateMedicine(Medicine* m) throw (RepositoryException) = 0; 

Удалить =0;
Хотя это разрешено иметь определение чисто виртуальных функций, они все еще остаются чисто виртуальными и не позволять не виртуальные вызовы.

+0

Спасибо, это сработало! :) – MathMe

+0

+1 Примечание: вы * можете * объявить как чистую виртуальную * и * предоставленную реализацию, как первоначально выполнял OP. Для этого требуется, чтобы реализация была вне линии (опять же, как это делал OP), и вы сохраняете '= 0;' в формальном объявлении. Знал ли он это или нет, его код был действительным как реализация, а не как конструктивный класс объектов. Не часто используется эта функция языка, но она поддерживается. – WhozCraig

+0

@alexrider Можете ли вы объяснить мне, почему нам действительно нужны эти виртуальные методы? Я действительно не понимаю. :( – MathMe

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