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

Visual C++ Discussion :

static ou virtual


Sujet :

Visual C++

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut static ou virtual
    bonjour,

    J'ai une compilation qui butte sur la définition des primitives;
    celle ci sont déclarées virtual
    le compilateur me demande des static
    je vous et les déclarations et le code et les injures :
    les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		virtual int Dialect() = 0;
    		virtual void Create(int dialect) = 0;
    		virtual void Connect() = 0;
    		virtual bool Connected() = 0;
    		virtual void Inactivate() = 0;
    		virtual void Disconnect() = 0;
    		virtual void Drop() = 0;
    moi j'ai codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    			try
    			{ // 3
    				IBPP::IDatabase::Drop();
    			} // 3
    			catch( IBPP::Exception &e)
    			{ // 3
    				strcpy_s( final_err_buff, 2048, e.ErrorMessage());
    			} // 3
    et le compilateur me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(513): error C2352: 'IBPP::IDatabase::Drop'*: appel non conforme d'une fonction membre non static
    1>          D:\usr\Memoria\dev\DBMS\OnLineDBManager\ibpp-2-5-3-1-src\core\IBPP.h(590)*: voir la déclaration de 'IBPP::IDatabase::Drop'
    quel risque prendrais je en remplaçant virtual par static
    celui qui me répondra sera

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comprends-tu seulement la signification de ces deux mots?

    ...Appeler une méthode virtuelle via Classe::Méthode(), ça ne se fait généralement que depuis une redéfinition de la méthode en question dans une classe dérivée, pour appeler la version de la classe mère. Hors de ce contexte, un tel appel n'est généralement pas pertinent.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MaClasseDerivee::UneMethodeVirtuelle()
    {
    	std::cout << "Dans classe dérivée!" << std::endl;
    	ClasseDeBase::UneMethodeVirtuelle();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut je n'ai pas compris ton exexemple
    Je n'ai pas compris ton exemeple

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Pour appeler une methode membre non static la syntaxe est :
    • objet.Drop();
    • ou ptr_objet->Drop();
    • ou dans une méthode de IBPP :: IDatabase this->Drop();
    • ou son abbréviation Drop();


    Alors que la syntaxe IBPP :: IDatabase :: Drop(); sert à appeler une fonction static de classe.

    Il est vrai que la dernière possibilité peut être utilisée dans une méthode membre d'une classe dérivant de IBPP :: IDatabase, elle est alors équivalente à :
    this->IBPP :: IDatabase :: Drop();

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est un exemple du cas qui est pratiquement le seul cas où il est pertinent d'appeler une méthode virtuelle d'une classe avec NomDeLaClasse::NomDeLaMéthode(). Normalement, les méthodes virtuelles de la classes sont appelées via un pointeur ou une référence, du genre pMonObjet->MethodeVirtuelle().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut J'ai essayé
    J'ai essayé this qui est refusé par le compilateur
    j'ai essayé :
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ptr_objet->Drop();
    avec le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(514): error C2039: 'Drop'*: n'est pas membre de 'System::Object'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll*: voir la déclaration de 'System::Object'

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Euh,
    Dans mes exemples, je posait qu'il existe un objet du type attendu.

    Si ptr_objet il y a, alors il est du type IBPP :: IDatabase et provient d'un vrai objet créé du type IBPP :: IDatabase.
    Il existe des tutoriaux sur le C++, je t'encourage à les consulter.

    Mais attention à ne pas confondre C++ et C++/CLI qui se ressemblent

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

Discussions similaires

  1. Mais que fait static ???
    Par elsargento dans le forum C
    Réponses: 4
    Dernier message: 25/09/2003, 09h55
  2. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58
  3. Virtual-key code
    Par lyrau dans le forum Windows
    Réponses: 2
    Dernier message: 29/03/2003, 19h22
  4. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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