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 :

error C3892 sous VS2008


Sujet :

C++

  1. #1
    Membre confirm� Avatar de ke2007
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Ao�t 2007
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 82
    Par d�faut error C3892 sous VS2008
    Bonjour,

    Je suis sous VS2008 et dans mon programme, j'obtiens l'erreur:
    Erreur 1 error C3892: 'this'*: vous ne pouvez pas assigner une variable const c:\....\caserailstation.cpp 37 monop2
    En gros, il me dit que je peux pas modifier la valeur d'une constante (ici this) ce que je comprend...

    Mais ce que je comprend pas, c'est d'o� vient le probl�me.
    J'ai 2 classes l'une h�ritant de l'autre.

    Classe 1:
    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
     
    class CaseProperty :
    	public Case
    {
    protected:
    	int pricePurchasing; // prix d'achat
    	int priceMortGage; // prix d'hypothèque
    	std::string name;
    	Player *owner;
     
    public:
    	CaseProperty(std::string = "", int = 0, int = 0);
    	virtual ~CaseProperty(void);
     
    	virtual int getRent() const = 0;
     
    	int getPricePurchasing() const;
    	int getPriceMortGage() const;
    	std::string getName() const;
    	Player* getOwner();
     
    	void setOwner(Player* p);
     
    	bool isOwned() const;
     
    	bool operator ==(const CaseProperty&);
    };
    Classe 2:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class CaseRailStation :
    	public CaseProperty
    {
    public:
    	CaseRailStation(std::string = "", int = 0, int = 0);
    	~CaseRailStation(void);
     
    	std::string getType() const;
    	void onCase(Player& p) const;
    	int getRent() const;
    };
    Le probl�me survient dans la m�thode onCase qui est une m�thode virtual pure de la classe m�re Case.
    Sa d�finition est:
    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
     
    void CaseRailStation::onCase(Player &p) const
    {
    	if(this->isOwned())
    		cout << "Vous devez payer à " << this->owner->getName() << endl;
    	else 
    	{
    		cout << "Voulez vous acheter la " << this->name << " au prix de " << this->pricePurchasing << " F? (y/n)" << endl;
    		string res;
    		do
    		{
    			cout << "votre reponse: ";
    			cin >> res;
    			cout << endl;
    		}
    		while(res != "y" && res != "n");
     
    		if(res == "y" && p.getCash() >= this->pricePurchasing)
    		{
    			p.retryCash(this->pricePurchasing);
    			this->owner = &p; // L'erreur est sur cette ligne !!!!!
    		}
    	}
    }
    Je ne vois pas pourquoi je n'aurais pas le droit de modifier la valeur de la propri�t� "owner". Elle est prot�g� et non priv� dans la classe CaseProperty.

    Si quelqu'un pouvait m'aider et m'expliquer mon probl�me ce serait super
    Merci d'avance !!

  2. #2
    Membre chevronn�
    Inscrit en
    Ao�t 2004
    Messages
    556
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 556
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    	void onCase(Player& p) const;
    En pla�ant le const ce dette mani�re, tu dis que cette m�thode ne modifiera pas l'�tat de l'instance courrante de ta classe.

    Or, c'est ce que tu fais dans cette m�me m�thode en tentant de modifier l'�tat de ton instance en modifiant l'un de ses attributs.

  3. #3
    Membre confirm� Avatar de ke2007
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Ao�t 2007
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 82
    Par d�faut
    Ok merci.

    Mais comment je peux modifier mon attribut?

    J'ai tent� de mettre une m�thode setOwner(Player& p) dans ma classe CaseProperty.
    Cette m�thode doit �tre commune � toute les classes filles et n'a pas besoin d'�tre red�finie.

    Mais quand je l'appel dans ma m�thode de CaseRailStation, il me met l'erreur:
    Erreur 1 error C2662: 'CaseProperty::setOwner'*: impossible de convertir un pointeur 'this' de 'const CaseRailStation' en 'CaseProperty &' c:\...\caserailstation.cpp 37 monop2

  4. #4
    Membre chevronn�
    Inscrit en
    Ao�t 2004
    Messages
    556
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 556
    Par d�faut
    Tu refais exactement la m�me chose que ton probl�me original, tu ne fais que le d�placer

    Dans une m�thode const, ton pointeur this est en r�alit� un constant. Tu ne peux donc pas le modifier directement. Pour pouvoir le modifier, tu dois passer par une m�thode non constante.

    Pour r�soudre ton probl�me, il suffit de rendre ta m�thode onCase non constante, c'est � dire enlever le const qui se situe � la fin de la d�claration de ta classe. Si cette m�thode modifie l'�tat de ta classe, elle n'est pas constante.

    Par contre, tu as un effet de bord: cette m�thode ne pourra plus �tre utilis�e sur les objets constants ! (ce qui est logique)

  5. #5
    Membre confirm� Avatar de ke2007
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Ao�t 2007
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 82
    Par d�faut
    Ok, mais ma m�thode est m�thode virtual pure, donc elle est d�clar� comme ceci dans la classe m�re Case:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    virtual void onCase(Player& p) const = 0;
    Je suis oblig� d'avoir un const non?

  6. #6
    Membre chevronn�
    Inscrit en
    Ao�t 2004
    Messages
    556
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 556
    Par d�faut
    Si ta classe d�rive d'une certaine interface ou classe qui d�finis cette m�thode comme const (ce qui n'�tait pas le cas dans le code que tu avais montr�), alors oui, tu as tout int�r�t � ce que cette m�thode soit const. Tu as alors un probl�me dans le r�le de ta m�thode qui est ambig�e. Modifie-t-elle ou ne modifie-t-elle pas l'�tat courant ? Il faut le savoir. Est-ce que ta classe est elle r�ellement du type de son parent ?
    Tu peux �galement surcharger ta m�thode afin de ne pas avoir de probl�me d'abstraction, et avoir d'un c�t� ta m�thode const qui pourra �tre appell�e par les classes manipulant des objets du type parent, et avoir une m�thode non const pour les classes manipulant directement l'objet et ayant besoin de la m�thode non const. Cependant, tes 2 m�thodes ne feront strictement pas la m�me chose, et c'est un probl�me de design r�ellement important.

  7. #7
    Membre confirm� Avatar de ke2007
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Ao�t 2007
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 82
    Par d�faut
    Ouai je pense que je vais revoir la conception � ce niveau...
    Mais �a m'embete que je puisse pas modifi� l'attribut, m�me en appelant une autre m�thode qui le fasse...

    En tt cas merci pour la r�ponse �a ma aid� � comprendre le bug

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    Mais �a m'embete que je puisse pas modifi� l'attribut, m�me en appelant une autre m�thode qui le fasse...
    Et pourtant, c'est tout � fait logique. En d�clarant ta m�thode "const", tu t'engages � ne pas modifier l'objet lors de l'appel. Et le client (celui qui appelle ta m�thode) se repose sur cet engagement. Si tu pouvais rompre ton engagement comme si de rien �tait, autant ne pas prendre d'engagement du tout, il ne servirait plus � rien.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. error LNK2019 sous VS2008 / Windows7
    Par emilien76 dans le forum C++
    R�ponses: 2
    Dernier message: 18/01/2013, 14h46
  2. R�ponses: 2
    Dernier message: 17/11/2008, 14h01
  3. Compilation Error VS2005 sous VISTA
    Par jeanke59 dans le forum ASP.NET
    R�ponses: 9
    Dernier message: 03/09/2008, 11h04
  4. error LNK2019 sous evc4
    Par denny59 dans le forum MFC
    R�ponses: 5
    Dernier message: 31/07/2008, 10h45
  5. Unexpected error (2121) sous Access 97 ???
    Par showa dans le forum Access
    R�ponses: 7
    Dernier message: 05/12/2005, 22h33

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