No matching function for call to 'class::method(Class* const)'

Drerrawyn Messages postés 98 Statut Membre -  
SypayV Messages postés 7399 Statut Contributeur -
Bonjour, j'ai un problème, j'ai une méthode dans une classe qui permet de modifier l'objet qui appelle la méthode:
bool Bot::mine(Cube &target, int amount) {
        if(target.substrResistance(m_attack + amount)) // la methode substrResistance retourne true si le bloc est détruit
            target.die(this);
    } else
        return false;
}


Ma methode die() appartient à un classe Entity dont héritent Bot et Cube:
void Entity::die(Entity &from) {
    m_type = 1;
}

void Cube::die(Bot &from) {
    Entity::die(from);
    from.addScore(m_reward);
}



J'ai l'erreur suivante:
In member function 'bool Bot::mine(Cube&, int)':
no matching function for call to 'Cube::die(Bot* const)'
candidate is:
virtual void Cube::die(Bot&)
no known conversion for argument 1 from 'Bot* const' to 'Bot&'


Alors voilà, de ce que j'ai compris, le pointeur this que j'envoie est un Bot& const et ma fonction demande un Bot&. Mais comment je peux faire pour faire ce que je veux faire ? C'est à dire appeler une méthode d'un objet A qui agira sur l'objet B qui l'a appelé.
Bot appelle Cube.die() qui agis sur les membres du Bot qui l' a executé (enfin j'imagine que c'était assez clair avec le code hein mais bon ^^)
Merci pour votre aide future
A voir également:

2 réponses

SypayV Messages postés 7399 Statut Contributeur 449
 
Salut,

Il n'y a pas besoin de signaler la class d'origine dans les fonctions si les class sont en héritage.
La plus jeune fille aura toutes les variables public et protected

Edit : Ce qui veut dire, et ça saute aux yeux, dans la fonction die tu n'as pas besoin de la déclarer avec from puisque de toutes façons tu n'utilises même pas from dans la fonction. La variable qui sera changée sera celle de la class qui reçoit l'appel. Si tu veux que ce soit celle qui appel la fonction qui change son propre contenu, il n'y a même pas besoin de créer une fonction. Il suffit de remplacer target.die(this); par m_type = 1;

Il faut revoir la structure.

Musicalement,
SypayV.
0
Drerrawyn Messages postés 98 Statut Membre 6
 
En fait j'ai copié un bout de code un peu vieux, c'est form->m_type = 1; à la place de m_type = 1;

En fait ce que je veux faire c'est que il y a plusieurs types de blocks, dont certains qui modifient les attributs, je peux toujours faire autrement, mais je pensais avoir une methode unique qui fasse des choses différentes (methode virtuelle) pour chaque type de block, enfin bon, je vais changer la conception du coup.
Merci
0
SypayV Messages postés 7399 Statut Contributeur 449
 
Puisque form est une référence et non un pointeur, ça aurait été form.m_type = 1;

Edit : this est un pointeur. Si tu veux le déréférencer pour qu'il s'adapte à une fonction qui attend une référence, tu devrais faire *this.

target.die(*this);
0