begin process at 2012 05 30 04:57:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Tableau contenant des valeurs de types différents


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

Tableau contenant des valeurs de types différents

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

mondrone

Membre Club
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

Julien39

Membre Club Administrateur CodeS-SourceS
Bonjour,

La première question à se poser dans ce genre de cas est : est il bien nécessaire de n'avoir qu'un seul tableau ?

Si oui, j'ai fais un tutoriel en java qui permet de faire proprement ce genre de choses, le principe en C++ est identique : http://www.javafr.com/codes/TUTORIEL-CREER-LISTE-CONTIENT-DEUX-TYPES-OBJETS_53352.aspx

Bon courage
jeudi 1 septembre 2011 à 17:34:24 | Re : Tableau contenant des valeurs de types différents

mondrone

Membre Club
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

Administrateur CodeS-SourceS
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

Membre Club
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

Administrateur CodeS-SourceS
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

Membre Club

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

Administrateur CodeS-SourceS
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

Membre Club

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 !!!

1 2

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)


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,374 sec (4)

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