Je viens d'essayer en créant 3 classes :
npc()
et
bomb()
qui dérivent de la classe element()
Voici les sources :
ELEMENT.H
#ifndef ELEMENTS_H
#define ELEMENTS_H
#include <iostream>
class elements
{
public:
elements();
virtual ~elements();
int m_y;
protected:
private:
};
#endif // ELEMENTS_H
ELEMENTS.CPP
#include "elements.h"
elements::elements()
{
m_y = 0;
}
elements::~elements()
{
}
NPC.H
#ifndef NPC_H
#define NPC_H
#include "elements.h"
class npc : public elements
{
public:
npc();
virtual ~npc();
int m_y;
static bool estDerriere(npc *a, npc *b);
protected:
private:
};
#endif // NPC_H
NPC.CPP
#include "npc.h"
npc::npc()
{
m_y = rand()%600;
}
npc::~npc()
{
}
bool npc::estDerriere(npc *a, npc *b)
{
return a->m_y < b->m_y;
}
BOMB.H
#ifndef BOMB_H
#define BOMB_H
#include "elements.h"
class bomb : public elements
{
public:
bomb();
virtual ~bomb();
int m_y;
static bool estDerriere(bomb *a, bomb *b);
protected:
private:
};
#endif // BOMB_H
BOMB.CPP
#include "bomb.h"
bomb::bomb()
{
m_y = rand()%600;
}
bomb::~bomb()
{
}
bool bomb::estDerriere(bomb *a, bomb *b)
{
return a->m_y < b->m_y;
}
Dans le main, je fais :
vector<npc *> m_npc;
vector<bomb *> m_bomb;
vector<elements *> m_elements;
for(int i = 0; i < NB_NPC; i++)
{ npc *mnpc = new npc;
m_npc.push_back(mnpc);
cout << "NPC(" << i << ") Y : " << m_npc[i]->m_y << endl; }
for(int i = 0; i < NB_BOMB; i++)
{ bomb *mbomb = new bomb;
m_bomb.push_back(mbomb);
cout << "BOMB(" << i << ") Y : " << m_bomb[i]->m_y << endl; }
cout << endl << " --- ETAPE 1 : TRI DES NPC SEULEMENT --- " << endl;
stable_sort(m_npc.begin(), m_npc.end(), npc::estDerriere);
for(int i = 0; i < NB_NPC; i++)
{ cout << "NPC(" << i << ") Y : " << m_npc[i]->m_y << endl; }
cout << endl << " --- ETAPE 2 : TRI DES BOMB SEULEMENT --- " << endl;
stable_sort(m_bomb.begin(), m_bomb.end(), bomb::estDerriere);
for(int i = 0; i < NB_BOMB; i++)
{ cout << "BOMB(" << i << ") Y : " << m_bomb[i]->m_y << endl; }
m_elements.push_back(m_npc[0]);
cout << endl << "adresse de m_npc[0] : " << m_npc[0] << endl;
cout << "adresse de m_elements[0] : " << m_elements[0] << endl;
cout << "resultat : " << m_elements[0]->m_y << endl;
system("pause");
for(int i = 0; i < NB_NPC; i++) delete m_npc[i];
for(int i = 0; i < NB_BOMB; i++) delete m_bomb[i];
return 0;
Après lancement du programme, j'obtient :
NPC(0) Y : 172
NPC(1) Y : 210
NPC(2) Y : 254
NPC(3) Y : 258
BOMB(0) Y : 145
BOMB(1) Y : 365
BOMB(2) Y : 143
BOMB(3) Y : 404
--- ETAPE 1 : TRI DES NPC SEULEMENT ---
NPC(0) Y : 172
NPC(1) Y : 210
NPC(2) Y : 254
NPC(3) Y : 258
--- ETAPE 2 : TRI DES BOMB SEULEMENT ---
BOMB(0) Y : 143
BOMB(1) Y : 145
BOMB(2) Y : 365
BOMB(3) Y : 404
adresse de m_npc[0] : 0x3d2528
adresse de m_elements[0] : 0x3d2528
resultat : 0
Appuyez sur une touche pour continuer...
Pourquoi mon résultat vaut-il 0 au lieu de valoir la valeure du Y de m_npc[0] ? Puisque m_elements[0] et m_npc[0] ont la même adresse, utiliser m_elements[0]->m_y revient à utiliser m_npc[0]->m_y non ??