Accueil > Forum > > > > Tableau contenant des valeurs de types différents
Tableau contenant des valeurs de types différents
jeudi 1 septembre 2011 à 15:37:31 |
Tableau contenant des valeurs de types différents

mondrone
|
Bonjour,
Voilà, "nouveau" en développement c++,
je me demande comment puis-je faire, de la manière la plus propre possible, un tableau contenant des pointeurs de classes de différentes natures.
Pour être plus explicite, par exemple :
case 0=>String*
case 1=>Integer*
case 2=>Double*
case 3=>String*
Mais bien entendu, l'ensemble des types disponibles est connu, mais les types de chaque case sont décidés par l'utilisateur (par exemple lors de la lecture d'un fichier xml, mais c'est un détail a mon avis inutile ici).
Pour préciser, je sais parfaitement comment j'aurais fait en C, et je saurais le faire en C++, d'une manière plus ou moins identique, mais j'aimerais surtout savoir comment ce genre de problématique peut se résoudre, "d'une manière propre" en C++ ?
Merci d'avance :)
Qui ne tente rien...
Ne risque pas d'avoir grand chose !!!
|
|
jeudi 1 septembre 2011 à 16:55:17 |
Re : Tableau contenant des valeurs de types différents
|
jeudi 1 septembre 2011 à 17:34:24 |
Re : Tableau contenant des valeurs de types différents

mondrone
|
Merci pour cette réponse rapide.
Par contre, j'ai beau tenter de faire
class Vehicule
{
public:
virtual void payer();
};
class Voiture:Vehicule
{
void payer();
}
listeVehicules.add(new Voiture()) ;
le compilateur me dit :
main.cpp:9: error: ‘Vehicule’ is an inaccessible base of ‘Voiture’
Qui ne tente rien...
Ne risque pas d'avoir grand chose !!!
|
|
jeudi 1 septembre 2011 à 17:37:12 |
Re : Tableau contenant des valeurs de types différents

pop70
|
Salut,
tout d'abord faire ce que tu souhaites faire, à savoir stocker des types différents dans un même tableau est très déconseillé voici un code qui te fera comprendre pourquoi (mais aussi comment faire  )
Code C/C++ : #include <iostream>
typedef unsigned int* universel; /* Crée un type nommé "universel" équivalent à un pointeur sur un entier non-signé (tu peux mettre n'importe quel autre type de pointeur */
int main()
{
// Trois variables de types différents :
std::string texte = "Un texte simple";
int entier = 7;
double decimal = 6.3;
// Leur pointeurs respectifs :
std::string *ptr_texte = &texte;
int *ptr_entier = &entier;
double *ptr_decimal = &decimal;
universel tableau[3]; // Le fameux tableau de type universel
// Pour remplir ce tableau il faut transtyper toutes les valeurs qui y rentre :
tableau[1] = (universel)ptr_texte;
tableau[2] = (universel)ptr_entier;
tableau[3] = (universel)ptr_decimal;
std::cout << "Universel[1] = " << *tableau[1] << "\n"; // Affiche un nombre quelconque
std::cout << "Universel[1] = " << *(string*)tableau[1] << "\n\n"; // Affiche "Un texte simple
std::cout << "Universel[2] = " << *tableau[2] << "\n"; // Affiche 7
std::cout << "Universel[2] = " << *(int*)tableau[2] << "\n\n"; // Affiche 7
std::cout << "Universel[3] = " << *tableau[3] << "\n"; // Affiche un nombre quelconque
std::cout << "Universel[3] = " << *(double*)tableau[3] << "\n"; // Affiche 6.3
return 0;
}
Dans ce code on voit que si à l'affichage on a oublié le type de la valeur qui est contenue et qu'on ne la transtype pas, on peut avoir n'importe quoi à la sortie.
Et encore, ce que tu cherches à faire est un tableau de pointeurs, donc d'éléments qui ont toujours la même taille. Mais si jamais tu fais pareil pour stocker des valeurs, il y aura une perte d'informations : si par exemple tu stockes tout dans un tableau de char, les éléments devrons faire 1 octet, or si tu y met un entier, il vas changer de valeur car celui-ci se code sur 4octets et trois seront perdus... Bref ça fonctionne avec des pointeurs, mais pas avec des types. Et lorsque c'est avec des pointeurs, tu dois savoirs "quelle case contient quel type" pour pouvoir récupérer correctement la valeur contenue...
C++dialement
Pop70
|
|
jeudi 1 septembre 2011 à 17:56:48 |
Re : Tableau contenant des valeurs de types différents

CptPingu
|
1) Il y a un problème de conception. On ne mélange jamais des types de données, quelque soit le langage d'ailleurs.
2) Dans le cas d'un héritage, c'est différent car les types ont une base commune. On peut donc faire rentrer une classe "fille" dans une classe "mere" sans souci. Ce que tu as fait est bien. Tu as juste oublié de faire un héritage public (par défaut c'est privé). Donc la bonne manière est: class Voiture : public Vehicule
3) Enfin, quand bien même tu voudrais toujours mélanger des types, tu as le boost::variant, et le boost::any qui peuvent répondre à cette problématique.
________________________________________________________________________
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
|
|
jeudi 1 septembre 2011 à 17:56:58 |
Re : Tableau contenant des valeurs de types différents

mondrone
|
Merci, ca me décrit la méthode pour le faire en C, et effectivement ca marche, en dehors du fait que je ferait un truc du style
struct entrie
{
void *valeur;
char *(to_string)(void *valeur);
}
ou autre qui permet de conserver des infos sur la valeur enregistrée.
Là, je demande surtout la méthode la plus classe, pour :
imaginons que je veuille avoir une classe dont le contenu est défini par l'utilisateur (un peu genre une table SQL),
mais je voudrais éviter de tout stocker sous format texte.
Donc, quelle est la meilleure manière de le faire en C++ ?
J'étais parti sur un tableau, ou une liste de pointeurs associés a une clé.
Qui ne tente rien...
Ne risque pas d'avoir grand chose !!!
|
|
jeudi 1 septembre 2011 à 18:00:09 |
Re : Tableau contenant des valeurs de types différents

CptPingu
|
Peux-tu préciser ton problème ? Que cherches-tu à faire au final ?
Je peux sûrement t'orienter sur la bonne méthode, mais il me faut connaître la finalité. Il n'y a malheureusement pas de conception universelle.
________________________________________________________________________
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
|
|
jeudi 1 septembre 2011 à 18:13:55 |
Re : Tableau contenant des valeurs de types différents

mondrone
|
 OK.
Mon but est de créer une sur-couche a une base de données.
Cette sur-couche permettra une gestion supplementaire des données que la base ne permet pas de faire.
Pour se faire il me faut une manière de représenter les tables de la base, dans une structure ou dans une classe. mais je la veux générique tant qu'à faire.
Je ne sais pas si c'est assez clair, malheureusement je ne peux actuellement préciser beaucoup plus.
A vrai dire, les questions d'héritage je maitrise encore très mal.
Je ne savais pas qu'on pouvais le faire public. De meme, accéder à une méthode de la fille en ayant un pointeur sur la mère (Grace au virtuel ?)
Qui ne tente rien...
Ne risque pas d'avoir grand chose !!!
|
|
jeudi 1 septembre 2011 à 18:27:27 |
Re : Tableau contenant des valeurs de types différents

CptPingu
|
Si tu cherches à réaliser une surcouche, vérfie déjà que le produit n'existe pas (genre mysql++ ?).
Ton problème n'est pas très clair. Je vais essayer de supposer.
Si tu veux le faire par toi même par simple curiosité, l'héritage n'est pas la bonne manière.
Si ton but est d'avoir une répresentation colonne - type - valeur, il y a plusieurs approches.
Avec du template, tu peux créer une classe suffisamment générique pour représenter un nombre de colonne prédéfini(En C++0X en tout cas, en C++ "normal", ce n'est pas possible).
Exemple bidon pour une classe à trois types fixes sélectionnables:
Code C/C++ :
template <typename FirstType, typename SecondType, typename ThirdType>
struct Row
{
FirstType _a;
SecondType _b;
ThirdType _c;
};
Row<int, float, double> row(1, 1.0, 54.56);
Row<std::string, int, int> row("test", 5, 4);
// Tu peux ensuite faire un std::vector<Row<std::string, int, int> > ou std::list<Row<std::string, int, int> >
// et un std::vector<Row<int, float, double> > ou std::list<Row<int, float, double> >
Ou alors tu peux utiliser boost::tuple, qui est une version améliorer de mon exemple (avec un nombre de colonne quasi-illimité, fonctionne en C++ "normal").
Ce qui donnerait directement:
Code C/C++ :
std::vector<boost::tuple<int> >
std::vector<boost::tuple<int, float> >
std::vector<boost::tuple<int, float, double> >
std::vector<boost::tuple<int, float, double, float> >
// etc...
PS: class et struct en C++ c'est strictement identique, seul le niveau de visibilité par défaut varie. (struct = public, class = private).
________________________________________________________________________
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
|
|
jeudi 1 septembre 2011 à 18:37:24 |
Re : Tableau contenant des valeurs de types différents

mondrone
|
J'ai déjà vérifié si ça existait, mais je n'ai rien trouvé qui me convienne.
Tes solutions sont biens, mais hardcodées non ?
Quand je disais modulable, c'est à la volée.
La classe doit se calquer sur la structure de la base au démarrage de l'application.
Qui ne tente rien...
Ne risque pas d'avoir grand chose !!!
|
|
Cette discussion est classée dans : tableau, case, types, contenant, manière
Répondre à ce message
Sujets en rapport avec ce message
gestion de la mémoire [ par jc_romeo ]
BonjourJe dois manier de grandes quantité de données (plusieurs giga) et pour cela je les charge de manière séquencielle (et donc je dois libérer la m
Tableau contenant adresses de variable char [ par neoTHGLF ]
Bonjour, j'aimerais savoir s'il est possible d'avoir un tableau contenant 5 adresses de chaines de caractère, un tableau du genre qui donnerait ça :ta
Cacher un tableau de chiffre par un de caractere [ par RootASM ]
Bonjour,Je suis en train de programmer un démineur mais je ne sais pas comment faire pour afficher un tableau de '*' que le joueur verra et ou il entr
Pointeurs et changement de types louches [ par benlustr ]
Bonjour à tous. J'ai un problème bizarre : Je dois récupérer une image en niveaux de gris (0-255) en mémoire. Or, cette image est créée par une carte
Vector de plusieurs types [ par nisaloncaje ]
Bonjour, j'aimerais créer un tableau de type vector, mais que ce tableau puisse contenir plusieurs type d'objets mais qui héritent tous d'une meme cla
Trier un tableau de manière aléatoire [ par nisaloncaje ]
Bonjour, je suis débutant en c et j'aimerais savoir comment est-il possible de trier un tableau de manière aléatoire ? je m'explique :j'ai un tableau
Tableau contenant des données de differents type [ par Sat83 ]
Bonjour! je debute en C++ et je souhaiterais savoir si il existe quelquechose ressemblant a un tableau, mais pouvant contenir different type de donnée
les types(debutants) [ par infodaoudi ]
Bonjour,j'ai un fichier de données sous forme :0.001302 0.001234 0.001384 0.001465 0.000895 0.001641 0.001275 0.001363 0.001838 0.001221 0.00
afficher une grille [ par igloobuster ]
salut à tous, j'ai un tableau a deux dimmensions et j'aimerais afficher se tableau dans une fenetre.J'ai pensé à une Listview, mais le probleme est qu
Bloqué au début de mon algo [ par Darksnakes ]
Bonjour tout le monde, je débute en C et voila mon problèmeJ'aimerais faire un programme qui pour un tableauT[0..N] (toutes les cases initialisés à 1)
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|