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

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

polymorphisme compliqué


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

polymorphisme compliqué

jeudi 19 mai 2011 à 12:04:27 | polymorphisme compliqué

rajaspera

Bonjour,

j'ai un problème qui me bloque depuis 48 heures, j'ai décidé de finalement vous soumettre la question :

pour la figure suivante :

mes classes :
/* virtual */class WeightKernel
{
public:
WeightKernel();
virtual ~WeightKernel() { } ;
virtual void init(int)=0;

//virtual void initializeWeight(void) =0;
};

class Convolutional : public WeightKernel
{
int _kernelNumero ;
int _predecessorMapNumber;
.....

public:
Convolutional();
~Convolutional();
void init(int);
.......
};

déclaration dans le main :
WeightKernel* kernelTable ;

mon problème se situe au niveau de l'instanciation :

......
kernelTable = new Convolutional[6] ; // 6 par ex

for ( int i = 0 ; i < 6 ; i++ )
kernelTable[i].init(i);

le fait est que kernelTable[i] n'accède pas aux méthodes de la classe Convolutional mais uniquement celles de la classe abstraite de départ. (je veux bien car j'ai pas casté dynamiquement). En scrutant les rapport d'erreurs, le vftable n'occure que pour kerneltable[0]. Là se situe ma question comment se fait il que le vftable est appelé uniquement pour la première boucle autrement dit, la boucle marche pour l'unique première itération mais pas pour les autres. Pourquoi ?

dans l'attente de vos réponse, je vous en remercie d'avance !
jeudi 19 mai 2011 à 13:24:34 | Re : polymorphisme compliqué

CptPingu

Administrateur CodeS-SourceS
Évite les new ...[], préfère un std::list ou un std::vector.

Code C/C++ :
#include <iostream>
#include <list>

class WeightKernel
{
public:
  WeightKernel() {}
  virtual ~WeightKernel() { }
  virtual void init(int) = 0;
};

class Convolutional : public WeightKernel
{
  int _kernelNumero ;
  int _predecessorMapNumber;
public:
  Convolutional() {}
  ~Convolutional() {}
  void init(int) { std::cout << "conv" << std::endl; }

};

int main()
{
  std::list<WeightKernel*> kernelTable;
  for (int i = 0; i < 6 ; ++i)
    kernelTable.push_back(new Convolutional);


  int i = 0;
  for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
       it != kernelTable.end(); ++it)
  {
    (*it)->init(i);
    ++i;
  }

  for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
       it != kernelTable.end(); ++it)
    delete *it;

  return 0;
}



Y a un truc bizarre quand même dans ton code:
Tu fais rentrer un tableau fixe dans un simple pointeur... Or le polymorphisme, pour fonctionner correctement doit connaître sa base. Il te faut donc le faire de manière dynamique, avec un tableau contenant des pointeurs (**) et non un pointeur sur un tableau (*), sinon forcément seul le premier fonctionne...

Code C/C++ :
#include <iostream>

class WeightKernel
{
public:
  WeightKernel() {}
  virtual ~WeightKernel() { }
  virtual void init(int) = 0;
};

class Convolutional : public WeightKernel
{
  int _kernelNumero ;
  int _predecessorMapNumber;
public:
  Convolutional() {}
  ~Convolutional() {}
  void init(int) { std::cout << "conv" << std::endl; }

};

int main()
{
  WeightKernel** kernelTable = new WeightKernel*[6];

  for (int i = 0; i < 6 ; ++i)
    kernelTable[i] = new Convolutional;

  for (int i = 0; i < 6 ; ++i)
    kernelTable[i]->init(i);

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question


Cette discussion est classée dans : int, virtual, weightkernel, convolutional, kerneltable


Répondre à ce message

Sujets en rapport avec ce message

Comment déclarer une interface en C++ [ par Giles314 ] Bonjour,Ma question est quelque peu théorique car j'ai une solution mais qui ne me semble pas "pure".Ce que j'appelle une interface est une spécificat Ma première sérialisation d'objet [ par jex0519 ] Bonjour à tous,Je suis débutant en c++, et j'ai un projet ou je dois sauvegarder mes objets afin de pouvoir les recharger après...<br Utilisation d' interfaces en C++ [ par zaraki21 ] Bonjour, je suis actuellement en stage et je dois poursuivre le développement d'une application C++ qui utilise un mécanisme d'interfaces et, je me he multi heritage [ par foxz ] Bonjour,d'une maniere general.class strm{ // base stream virtual int w(void*,int)=0; // write virtual int r(void*,int)=0; //read};class fil:virtual pu class A:public int ??? [ par foxz ] J'ai besoin de faire ca : class A:public int{}; mais ca ne marche pas. (ni avec float) En fait, je veux cree une class ressemblant a un int mais j'a Pb avec graphe en C++ [ par gargourifahmi ] Salut à tous,Je suis en train d'implémenter un graphe basé sur les listes d'adjacence.En première étape, j'ai essayé d'initialiser le tableau de point int [ par ndubien ] Bonjour,Quel est le plus grand nombre que peut contenir un int? Merci d'avance et à bientôt. Multiplier un nombre a virgules [ par darkwhite ] Salut a tous, le principe de mon code est de multiplier par 3 un nombre decimal ecrit en notation française :xx,xx. j'ai donc ecrit ce code : #include [Win32] Pb ac DialogBoxParam [ par Neo_Fr ] Bonsoir, J'ai un probleme avec DialogBoxParam il retourne -1 et GetLastError 1812: Le fichier image spécifié ne contenait pas de section ressource. la fonction gotoxy() [ par S_M_E ] c encore moi personne n'a encore répondu à mon problème, JE VEUX DEPLACE le curseur de le fenetre dos à des endroit bien précis ave DEV C++, j'ai trou


Nos sponsors


Sondage...

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,998 sec (3)

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