Polymorphisme: vecteur contenant différents objets



Bonjour à tous,

je souhaite creer un vecteur contenant différents objets ayant tous des attributs differents. Je dois dans la suite de mon code recuperer la valeur des attributs des differents objets à partir de ce vecteur ! ce que je n'arrive pas à faire pour l'instant !


class Carte{}

class Creature: public Carte
{
//avec des attributs comme m_degat1
};
class Monstre: public Carte
{
//avec d'autres atttributs comme m_mochete1
};

vector <Carte*> test;

Creature *t1; //Je crée un pointeur du type de mon vecteur
t1=new Creature(); //je le "popinte sur un type créature
t1->Setm_degat1(20); //Je set ses degats à 20
test.push_back(t1); //Je l'ajoute à mon vecteur test
cout<<test[0]->Getm_degat1(); //Je tente d'afficher les degats de ma creatues rentrée precedemment



Le message d'erreur est toujours le même : "Class Carte* n'a pas d'attribut m_degat1" or je voudrai s que cette "case du vecteur devienne un type Creature.


Bonjour, I hope you are okay with using Google Translate.

You don't show the actual implementation of your methods, or which line number the error happens on. We must guess the exact problem.

Getm_degat1() must be a method inside of class Carte. In your post, it seems that Carte has an empty body.

Your vector<Carte*> test only has Carte pointers in it. test[0] is a pointer to Carte. It does not know about underlying Creature or Monstre objects, or their methods/data members. You cannot access them without a dynamic_cast.

If you are trying to implement polymorphism, your approach is incorrect.

Here is an example of polymorphism on a vector of object pointers:
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
62
63
64
65
66
67
#include <iostream>
#include <vector>

using std::vector;

class Carte {
  public:
    // pure virtual function
	 virtual void parle()=0;
};

class Creature : public Carte
{
  public:
	Creature(int degat1)
	: Carte()
	{
	    m_degat1 = degat1;
	}
    
    void parle()
    {
    	std::cout << "plainte !  degat1 = " << m_degat1 << std::endl;
    }
    
    int m_degat1;
};

class Monstre: public Carte
{
  public:
	Monstre(int mochete1)
	: Carte()
	{
		m_mochete1 = mochete1;
	}
	
    void parle()
    {
    	std::cout << "hurle !  mochete1 = " << m_mochete1 << std::endl;
    }
	
    int m_mochete1;
};

int main()
{
    vector <Carte*> test;
    
    Creature *t1 = new Creature(20);
    Monstre *t2 = new Monstre(42);
    Carte *t3 = new Monstre(-3);
    
    test.push_back(t1);
    test.push_back(t2);
    test.push_back(t3);
    
    for (size_t i = 0; i < test.size(); i++)
    {
        test[i]->parle(); 
    }
    
    delete t1;
    delete t2;
    delete t3;

}
Last edited on
Topic archived. No new replies allowed.