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