Singleton: undefined method
Bonsoir,
Je veux faire un scheduler. Il s'agit d'une classe singleton à laquelle on va ajouter des taches (interface Task). Les Task implémentent une méthode pour l'opérateur <, ce qui permet au scheduler d'ordonnacer les tâches selon
l'heure à laquelle on voudrait les lancer et leur priorité.
A terme, l'objectif est que le scheduler fasse tourner un thread qui va entretenir une horloge temps réel et une horloge virtuelle qui vont servir à lancer les différentes tâches (méthode virtuelle pure "run").
Voilà pour le décor.
J'ai commencé par faire un singleton en reprenant ce que j'ai trouvé sur un des tutos de developpez (au final ça ne fonctionnait pas, j'en suis revenu à un bête copié/collé), ainsi que ma classe Scheduler.
Malheureusement, quand j'essaye de récupérer mon scheduler, le compilo me dit que la méthode n'est pas définie..
La class template singleton
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
/*
* Singleton.h
*
* Created on: 5 sept. 2010
* Author: seeme
*/
//Not safe in multithread! Be carreful..
#ifndef SINGLETON_H_
#define SINGLETON_H_
template <class T> class Singleton{
public:
static T* get();
static void kill();
protected:
static T* m_i;
private:
T& operator=(const T&){}
};
#endif /* SINGLETON_H_ */ |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
/*
* Singleton.h
*
* Created on: 5 sept. 2010
* Author: seeme
*/
//Not safe in multithread! Be carreful..
#include "Singleton.h"
template <class T> T* Singleton<T>::m_i=0;
template <class T> T* Singleton<T>::get(){
if(m_i==0){
m_i=new T();
}
return m_i;
}
template <class T> void Singleton<T>::kill(){
delete m_i;
m_i=0;
} |
Et le scheduler
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
/*
* Scheduler.h
*
* Created on: 5 sept. 2010
* Author: seeme
*/
#ifndef SCHEDULER_H_
#define SCHEDULER_H_
#include <list>
#include <ctime>
#include "Task.h"
#include "../Tools/Singleton.h"
#include <ostream>
#include <iterator>
class Scheduler: public Singleton<Scheduler>{
friend Scheduler* Singleton<Scheduler>::get();
friend void Singleton<Scheduler>::kill();
private:
std::list<Task*>* m_taskList;
unsigned long m_virtualTime;
void run();
Scheduler();
~Scheduler();
public:
void addTask(Task* t);
virtual void print(std::ostream& o) const {
o << "Scheduler: " << std::endl;
std::list<Task*>::iterator it;
it = m_taskList->begin();
while(it != m_taskList->end()){
o << **it << std::endl;
it++;
}
}
friend std::ostream& operator<<(std::ostream& out, const Scheduler& v){
v.print(out);
return out;
}
};
struct Compar
{
bool operator()(Task* left, Task* right){
return (*left < *right);
}
};
#endif /* SCHEDULER_H_ */ |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
/*
* Scheduler.cpp
*
* Created on: 5 sept. 2010
* Author: seeme
*/
#include "Scheduler.h"
#include <iostream>
Scheduler::Scheduler() {
m_taskList = new std::list<Task*>();
m_virtualTime = 0;
std::cout << "Constructor" << std::endl;
}
Scheduler::~Scheduler() {
//All remaining task are to be deleted
while(m_taskList->begin() != m_taskList->end())
delete *m_taskList->begin();
std::cout << "Destructor" << std::endl;
}
void Scheduler::addTask(Task* t){
m_taskList->push_back(t);
m_taskList->sort(Compar());
} |
et un exemple d'utilisation qui plante lamentablement:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
/*
* Main.cpp
*
* Created on: 29 août 2010
* Author: seeme
*/
#include "Main.h"
#include "Scheduler/Scheduler.h"
#include <iostream>
using namespace std;
int main(int argc, char**argv){
Scheduler::get(); // <-- undifined ref to Singleton<Scheduler>::get()
/*Scheduler * s = Singleton<Scheduler>::get();
s->addTask(new Task("Une tache", 10, 1, 1, NORMAL));
Scheduler::kill();*/
return 0;
} |
Merci d'avance
Seeme