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

Fermé
Drerrawyn Messages postés 81 Date d'inscription vendredi 24 octobre 2014 Statut Membre Dernière intervention 29 juin 2016 - 13 juil. 2015 à 20:12
SypayV Messages postés 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 - 13 juil. 2015 à 22:04
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 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 449
Modifié par SypayV le 13/07/2015 à 20:35
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 81 Date d'inscription vendredi 24 octobre 2014 Statut Membre Dernière intervention 29 juin 2016 6
13 juil. 2015 à 21:02
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 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 449
Modifié par SypayV le 13/07/2015 à 22:07
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