IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Impossible de faire passer un this en argument


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut Impossible de faire passer un this en argument
    Bonjour,

    Je rencontre actuellement un problème bloquant dont je ne trouve pas la solution, le but qu'un objet puisse envoyer un this ( donc un pointer vers lui même ) à un autre objet ( via son constructeur ) en argument.

    voici ce que j'ai essayé en version simplifié qui ne fait apparaitre que le code du problème :

    UnitTower.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class UnitTower
    {
    public:
    	UnitTower();
    	~UnitTower();
    	sf::Sprite getSprite();
    	void update();
    	void setTarget(UnitMobile);
    	UnitMobile getTarget();
     
    protected:
    	UnitMobile cible;
    	sf::Texture texture;
    	sf::Sprite sprite;
    };
    Une fonction dans le UnitTower.cpp qui doit crée un objet et envoyer un pointer de lui même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void UnitTower::update(){ Shoot shoot(this) }
    le constructeur de l'objet qui récupère l'autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Shoot
    {
    public:
    	Shoot(UnitTower*);
    	~Shoot();
    	void fire();
     
    protected:
    	sf::Texture texture;
    	sf::Sprite sprite;
    	int dommage;
    	UnitTower* tower;
    	sf::Clock clock;
    };
    Et son Shoot.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Shoot::Shoot(UnitTower* tOwer)
    {
    	tower = tOwer;
    }
    Je vous remercie d'avance et je continue à chercher

    Cdlm,

    Phobizeur

  2. #2
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Lu'!

    Et donc c'est quoi l'erreur ?

    Deux trucs au passage quand même :
    • changer la casse d'un caractère dans le mot pour lever une amibguité ça promet des jolis fails sur les fautes de frappes
    • c'est normal que la cible soit modifiée en recevant une copie ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    L'erreur :

    1>UnitTower.cpp(46): error C2664: 'Shoot::Shoot(const Shoot &)' : cannot convert argument 1 from 'UnitTower *const ' to 'const Shoot &'
    Pourtant c'est tout simple, lorsque je crée Shoot shoot(this), je veux récupérer la tower pour avoir ses variables dans shoot.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A priori, le code que tu montres n'est pas celui qui a levé l'erreur.
    Nettoie ton projet (clean) et recommence.

    Par ailleurs, utilise la liste d'initialisation du constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shoot::Shoot(UnitTower* tower) : tower(tower) {}
    le tower en rouge est le nom du champ, dans la classe.

    Seule la liste d'initialisation est capable de remplir les champs constants et les références.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    J'ai viens d’essayer avec la liste d'initialisation et j'ai toujours la même erreur sauf que j'ai plus de détail ^^"

    Le détail :

    Reason: cannot convert from 'UnitTower *const ' to 'const Shoot'
    Je ne vois pas pourquoi ça ne marche pas !

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Visiblement, tu essaye de passer à ton constructeur un pointeur constant sur une UnitTower, alors qu'il s'attend à avoir un pointeur non constant. Donc soit tu n'as pas besoin de modifier la UnitTower depuis la classe Shoot, et tu prend en paramètre un pointeur constant que tu stockes dans un pointeur constant, soit la modification est requise, et dans ce cas là, il faut passer un pointeur non constant au constructeur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    J'ai modifié le prototype en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shoot(UnitTower const*);
    et le constructeur en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shoot::Shoot(UnitTower const* tOwer) : tower(tOwer)
    mais j'ai toujours l'erreur :
    1>UnitTower.cpp(46): error C2664: 'Shoot::Shoot(const Shoot &)' : cannot convert argument 1 from 'UnitTower' to 'const Shoot &'
    1>          Reason: cannot convert from 'UnitTower' to 'const Shoot'
    1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    En sachant que l'appelle du constructeur de Shoot se fait via une fonction de UnitTower.cpp :


  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    As-tu, comme recommandé par leternel, nettoyé et recompilé ton projet ? Compiles/Travailles-tu aussi sur le bon fichier ?
    Liste d'initialisation ou pas, le code que tu nous montres n'est pas en accord avec ces erreurs.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    J'ai clean et rebuilt... Toujours la même erreur...

    J'ai upload le projet pour les courageux qui veulent jeter un œil :

    Merci encore de vos réponses et de votre patience.
    Fichiers attachés Fichiers attachés

  10. #10
    Invité
    Invité(e)
    Par défaut
    N'aurais-tu pas oublié de nous montrer un certain nombre d'autres erreurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    1>Shoot.h(8): error C2061: erreur de syntaxe*: identificateur 'UnitTower'
    1>Shoot.h(16): error C2143: erreur de syntaxe*: absence de ';' avant 'const'
    1>Shoot.h(16): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>UnitTower.cpp(27): warning C4244: 'initialisation'*: conversion de 'float' en 'int', perte possible de données
    1>UnitTower.cpp(32): warning C4244: 'argument'*: conversion de 'int' en 'float', perte possible de données
    1>UnitTower.cpp(36): warning C4244: 'argument'*: conversion de 'int' en 'float', perte possible de données
    1>UnitTower.cpp(39): warning C4244: 'argument'*: conversion de 'int' en 'float', perte possible de données
    1>UnitTower.cpp(43): warning C4244: 'argument'*: conversion de 'int' en 'float', perte possible de données
    1>UnitTower.cpp(46): error C2664: 'Shoot::Shoot(const Shoot &)'*: impossible de convertir l'argument 1 de 'UnitTower *const ' en 'const Shoot &'
    1>          Raison*: impossible de convertir de 'UnitTower *const ' en 'const Shoot'
    1>          Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
    1>  TowerNoob.cpp
    1>Shoot.h(8): error C2061: erreur de syntaxe*: identificateur 'UnitTower'
    1>Shoot.h(16): error C2143: erreur de syntaxe*: absence de ';' avant 'const'
    1>Shoot.h(16): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>TowerNoob.cpp(14): warning C4244: 'argument'*: conversion de 'int' en 'float', perte possible de données
    1>  Source.cpp
    1>Shoot.h(8): error C2061: erreur de syntaxe*: identificateur 'UnitTower'
    1>Shoot.h(16): error C2143: erreur de syntaxe*: absence de ';' avant 'const'
    1>Shoot.h(16): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>TileMap.h(32): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(33): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(34): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(35): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(38): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(39): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(40): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    1>TileMap.h(41): warning C4244: 'argument'*: conversion de 'unsigned int' en 'float', perte possible de données
    Tes deux classes Shoot et UnitTower font référence l'une à l'autre. Voir ce sujet de la FAQ.

    Prend l'habitude de commencer par la première erreur rencontrée par le compilateur, souvent celles qui suivent en découlent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire passer un argument dans un script sql
    Par Dodo86 dans le forum Pentaho
    Réponses: 3
    Dernier message: 31/03/2010, 14h20
  2. Réponses: 4
    Dernier message: 22/02/2010, 22h45
  3. Impossible de faire passer mon DataContext ! Une idée ?
    Par Cvbdev dans le forum Windows Communication Foundation
    Réponses: 4
    Dernier message: 07/02/2010, 23h30
  4. Faire passer des arguments via window.open()
    Par juanqui dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/02/2007, 19h27
  5. Réponses: 5
    Dernier message: 08/03/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo