CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[c++]Passer type d'objet et type d'argu

Eauquai
Eauquai
Niveau 9
05 octobre 2012 à 12:36:21

Maudits titres raccourcis de topics.

J'ai plusieurs classes : C1, C2, C3, ... , Cn
Chacune de ces classes possède plusieurs attributs : m1, m2, m3, ... , mn.

Pour simplifier, supposons que tous ces attributs soient publics.

Voici mon problème. Dans mes rêves, j'aurais une fonction qui ferait la chose suivante :

void affiche(objet &nom_de_objet, attribut &type_attribut)
{
cout << nom_de_objet.type_attribut ;
}

Ou, au pire, si ce n'est pas faisaible, une fonction pour chaque classe, du genre :

void affiche(C1 &objet, attribut &type_attribut), qui fait la même chose que la fonction précédente. Mais évidemment ça ne marche pas, il faut que le compilateur sache à l'avance quels types d'objets il va traiter, non ?

Quelqu'un a une idée pour me dépanner ?
Parce que si j'ai 5 classes, avec chacune entre 20 et 50 attributs, faire une fonction pour afficher chaque attribut de chaque classe, c'est clairement galère.

tbop2
tbop2
Niveau 10
05 octobre 2012 à 13:32:44

Bonjour,

Avant toute chose pourquoi au lieu de prendre un cas general assez fumeux ne pas tout simplement prendre le cas concret a savoir : qu'est-ce que tu veux faire et dans quel contexte deja pre-existant ?

godrik
godrik
Niveau 30
05 octobre 2012 à 14:34:21

Eauquai, je n'ai pas compris non plus le "practical use case", mais ca m'a l'air d'etre un cas ou tu es bon pour ecrire tes 5 fonctions (mon dieu 5 fonctions a ecrire!!)

hyrulink2
hyrulink2
Niveau 7
05 octobre 2012 à 14:52:33

Quelque chose comme ça?
http://pastebin.com/EViSxUg3

Mais je t'avoue que je vois pas trop l'utilité.

Eauquai
Eauquai
Niveau 9
05 octobre 2012 à 16:38:37

hyrulink2 : Oui, c'est EXACTEMENT ça ! Merci beaucoup :ange:

Godrik : ben si j'ai 5 classes d'une vingtaine d'attributs, ça faisait déjà 100 fonctions à écrire...

tbop2
tbop2
Niveau 10
05 octobre 2012 à 17:58:40

Ah ouais c'est possible ca ? Dormirait moins con en fait.

Cela dit ca marche pas ton truc la si c'est pas un attribut public et excusez moi du peu mais c'est quand meme une solution ultra-moche encapsulationnesquement...

godrik
godrik
Niveau 30
05 octobre 2012 à 19:39:40

et ca ne marceh que si les attribut ont le meme nom. Et mon petit doigt me dit que si les attributs ont le meme nom, tu devrasi avoir un serieux refactoring du code.

chris_27
chris_27
Niveau 10
05 octobre 2012 à 20:12:59

Mon petit doigt me dit que l'OP ne veut pas faire ce qu'il demande surtout.

Manquerait plus qu'on apprenne qu'il utilise ça pour déboguer... :peur:

tbop2
tbop2
Niveau 10
05 octobre 2012 à 20:36:40

" ben si j'ai 5 classes d'une vingtaine d'attributs, ça faisait déjà 100 fonctions à écrire..."

Bienvenue dans l'univers impitoyable de la programmation mon cher ami ! :)

hyrulink2
hyrulink2
Niveau 7
05 octobre 2012 à 21:33:12

Avec l'encapsulation rien que pour toi tbop2:
http://pastebin.com/6AWn4Vwa

Pourquoi ça marche que si les attribut ont le même nom godrik?

Eauquai
Eauquai
Niveau 9
05 octobre 2012 à 22:28:12

"Cela dit ca marche pas ton truc la si c'est pas un attribut public et excusez moi du peu mais c'est quand meme une solution ultra-moche encapsulationnesquement..."

==> je peux faire ça sur les fonctions getter.

"et ca ne marceh que si les attribut ont le meme nom"

==> Non. Je pense que j'ai mal expliqué ce que je voulais faire. Je veux une fonction (et je l'ai à présent :D ) qui me donne, pour n'importe quelle instance I de la classe C et pour n'importe quel attribut A de cette classe, la valeur I.C, simplement en appelant la fonction give_me(I, A::C).

"Mon petit doigt me dit que l'OP ne veut pas faire ce qu'il demande surtout.

Manquerait plus qu'on apprenne qu'il utilise ça pour déboguer... "

==> Non non, je te confirme que je n'ai pas de desseins cachés^^

chris_27
chris_27
Niveau 10
05 octobre 2012 à 22:30:31

Alors tu n'as pas besoin d'une telle (séries de) fonction(s, parce que oui, ton template va faire exploser le nombre de fonctions dans ton code). :-)))

godrik
godrik
Niveau 30
06 octobre 2012 à 00:50:00

"Non. Je pense que j'ai mal expliqué ce que je voulais faire. Je veux une fonction (et je l'ai à présent :D ) qui me donne, pour n'importe quelle instance I de la classe C et pour n'importe quel attribut A de cette classe, la valeur I.C, simplement en appelant la fonction give_me(I, A::C)."

Si tu as besoin d'y acceder a partir de l'exterieur, la variable devrait etre publique. Si tu n'as pas besoin d'y acceder depuis l'exterieur, ce que tu veux faire n'a pas de sens.

Neofungamer
Neofungamer
Niveau 22
06 octobre 2012 à 11:44:19

Ca existe en c++ un truc comme "give_me(I, A::C)" ?

hyrulink2
hyrulink2
Niveau 7
06 octobre 2012 à 17:52:26

:d) Oui c'est la fonction mem_get que j'ai donné dans mon post précedent.

Il y a ici une atmosphère d'hostilité assez désagréable, si ça répond au problème de l'OP tant mieux, je vois pas à quoi sa sert d'essayer de prouver absolument à l'OP qu'il fait des chose inutiles à part polluer le topic. Surtout que cette technique est utile, par exemple pour traiter un ensemble d'objets, il veut peut être faire des choses plus complexes qu'un simple cout.

godrik
godrik
Niveau 30
06 octobre 2012 à 17:53:24

tu dois pouvoir hacker un truc comme ca avec le preprocesseur, mais ca va etre crado. Dans l'ensemble, je ne vois pas de cas raisonnable ou tu as besoin de faire ca. Encore une fois, si la variable est privee, tu ne veux pas faire ca. Si la variable est publique, pourquoi faire complique?

hyrulink2
hyrulink2
Niveau 7
06 octobre 2012 à 18:39:34

Je vois au moins un cas concret d'utilisation, pour sommer un ensemble d'objets sur un certain membre:
http://pastebin.com/vPtuxbPE

C'est moins porc qu'une solution avec des macros quand même.

On peut en trouver plein d'autres (mapper un ensemble sur un membre, fusionner, ...)

godrik
godrik
Niveau 30
06 octobre 2012 à 19:26:32

Tu es un peu atteint du syndrome de Boost hyrulink. Il est plus simple d'utiliser sum et de passer la fonction qui extrait la donne que tu veux comme lambda. C'est d'ailleur plus generique puisque ca te permet de faire un traitement sur la valeur en passant. Imagine que tu ne veux sommer que les valeures positives et cette technique tombe a l'eau.

chris_27
chris_27
Niveau 10
06 octobre 2012 à 20:06:17

hyrulink2: il y a un problème dans ton code, tu as oublié d'injecter de l'assembleur pour le rendre encore plus dégueulasse et dépendant de l'architecture. À mon avis, c'est un oubli grave. :(

hyrulink2
hyrulink2
Niveau 7
06 octobre 2012 à 21:14:58

C'est personnel mais je trouve que c'est plus clair
accumulate_member(a, std::end(a), &A::i);
que
std::accumulate(a, end(a), 0, (int i, A const& a) { return i + a.a; });
J'aurais pu ajouter un foncteur qui transforme les membres pour le problème que tu a énoncé.
Après chacun son style du moment que c'est propre.

Chris, a part dire de la merde je vois pas l'utilité de ton post. Quand on se permet de critiquer comme tu le fait la moindre des choses c'est d'être constructif. Mais je vais arrêter ici le sujet parce que là ça tourne au dialogue de sourd et c'est pas très intéressant.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment