begin process at 2012 05 29 13:55:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

Polymorphisme et Tableau


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Polymorphisme et Tableau

mercredi 30 août 2006 à 10:46:48 | Polymorphisme et Tableau

benroger

Bonjour à tous,

Je travaille actuellement sous Visual 2003.net, sous Windows XP.

J'ai developpé en C ++ une application SDI qui utilise une classe mère CMere qui contient une fonction virtuelle pure void Infos(void). J'ai également une classe CFille dérivée de CMere dans laquelle je définis la fonction void Infos(void).

Ces 2 classes sont utilisées dans une fonction du Document. Dans cette fonction, j'alloue un tableau t de CFille. Voici le code de cette fonction :

void CEssaiDoc::OnTest()

{

CMere* t;

t=new CFille[3];

for ( int i=0;i<3;i++)

t[i].Infos();

delete [] t;

}

Comme vous le voyez, ça n'a pas l'air bien méchant, mais à l'éxecution du programme, j'observe une erreur dans la boucle sur i :
Pour i = 0 : Tout se passe bien
Pour i = 1 : Erreur de lecture dans la mémoire.

Comme on peut s'en douter, ma question est d'où vient cette erreur ? Pourquoi, lorsque j'utilise le polymorphisme je n'arrive pas à utiliser correctement un tableau de CFille ?

Merci pour vos réponses ! J'espère avoir été complet dans me description, mais soyez indulgents, ce n'est jamais que mon premier message !

PS :
Pour information voici les codes sources (tres courts) des classes meres et filles :

Mere.h :

#pragmaonce

class CMere

{

private

:

int m_fc;

int m_C;

public

:

CMere(

void );

~CMere(

void );

virtual void Infos()=0;

};


Mere.cpp :

#include

"StdAfx.h"

#include

".\mere.h"

CMere::CMere(

void)

{

}

CMere::~CMere(

void)

{

}

Fille.h :

#pragma

once

#include

"mere.h"

class

CFille:

public CMere

{

public

:

CFille(

void);

~CFille(

void);

void Infos();

private

:

int m_fc;

int m_C;

};

Fille.cpp :

#include

"StdAfx.h"

#include

".\fille.h"

CFille::CFille(

void)

{

}

CFille::~CFille(

void)

{

}

void

CFille::Infos()

{

}



mercredi 30 août 2006 à 11:52:54 | Re : Polymorphisme et Tableau

juju12

Salut;

Essaye :

for(int i=0;i<3;i++)
{
t[i].Infos();
}
delete [] t;

En .net je ne sais pas mais en C++ les {} sont nécessaires, à moins d'écrire sur la même ligne.
mercredi 30 août 2006 à 12:06:32 | Re : Polymorphisme et Tableau

luhtor

Non, les {} ne sont pas nécessaire. C'est comme pour un "if"
if (...) cout << "coucou" << endl;

Mais le polymorphisme fonctionne que sur un pointeur. Car dans ton truc:

CMere* t;

Tu créés un tableau d'objet CMere, et non un tableau de pointeur d'objet CMere. Mais tu ne peux pas accéder a la fonction virtuelle de CMere.

Si tu déclares "t" par: CFille * t. Ton truc marchera bien.

Mais si tu veux un tableau de pointeur de CMere:

CMere** t = new CMere*[3];

for (int i = 0 ; i < 3 ; ++i)
t[i] = new CFille();

// Puis on appelle la fonction Infos().

for(int i=0;i<3;i++)
t[i].Infos();

// Destruction

for(int i= 0 ; i < 3 ; ++i) delete t[i];

delete[] t;

Remarque: quand tu fais de l'héritage, il faut déclarer les destructeurs "virtual".


mercredi 30 août 2006 à 12:11:51 | Re : Polymorphisme et Tableau

juju12

Oups la gaffe...désolé.

Par contre il faudrait juste mettre t[i]->Infos() au lieu de t[i].Infos puisque c'est un pointeur.

mercredi 30 août 2006 à 12:13:41 | Re : Polymorphisme et Tableau

luhtor

Réponse acceptée !
Oui pardon :)


mercredi 30 août 2006 à 12:19:00 | Re : Polymorphisme et Tableau

luhtor

Mais bon je galère aussi avec ces histoires de polymorphisme avec pointeur ou référence. C'est assez compliqué car ca fonctionne également:

void Affiche_infos(CMere & _which) // <= ON A UNE REFERENCE LA
{
    _which.Infos();
}

CMere** t = new CMere*[3];
for (int i = 0 ; i < 3 ; ++i)
t[i] = new CFille();

for(int i=0;i<3;i++)
Affiche_infos(*t[i]);

for(int i= 0 ; i < 3 ; ++i) delete t[i];
delete[] t;


On obtiendra ici le meme résultat (normalement).


Cette discussion est classée dans : fonction, infos, void, cfille, cmere


Répondre à ce message

Sujets en rapport avec ce message

Pb CreateThreadddd !!!!!!!!!!! [ par neub ] Salut à tous, j'ecris un module de visionnement d'image etje souhaiterai pouvoir stopper ma fonction OnPlay au moment voulu mais j'ai un pb a la creat utiliser une fonction d'une lib C dans une classe c++ [ par snook ] Bonjour,j'aimerais savoir comment doit on proceder pourappeler une fonction d'une librairie ecrite en C dansmon programme C++?exemple: ma lib possede Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon Polymorphisme (question de debutant) [ par madlolo2 ] Alors la, j'avoue que j'y perds mon latin ...Regardez ce code : class CMere {public: int toto (char * var1, int var2); int toto (char * var1); CMere CDialog + Sockey ? [ par mickeydisn ] je suis entrin de realiser une application un a serveur Socket en Consol . L'application console pas de PB . Le clien j'ai cree une forme avec un edit Pointeur sur fonction envoyé par dll [ par MoDDiB ] Voila ce que j'ai fais mais ca ne marche pas :Dll :#include BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ retu pointeur static sur fonction :) [ par luhtor ] Certain reconnaitront surement le tutoriel en question. J'ai rajouté quelques trucs au gestionnaire d'exception, mais je bloque sur le point suivant:J Probleme Argument void* d'une fonction [ par Steph115 ] Bonjour,Pour info je travaille sous Linux en C++ j'ai une fonction definie comme ca : [Code]int ServeurSocket::emmetreSocket(void* trame, int taille){ Commande >>> Buffer [ par Stormy ] Salut à tous,Je cherche une solution afin de charger dans un Tampon une suite de commande ASM ou l'ensemble d'un code appartenant à une fonction C (co Utilisation d'un pointeur de fonction membre [ par cyrcocq ] Bonjour,J'ai déjà discuté de ça ailleurs, on m'a conseillé d'autres méthodes, mais imaginons une classe contenant un ensemble de fonction accessibles


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales