IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Nombre d'arguments infini, comment faire.


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Nombre d'arguments infini, comment faire.
    je ne suis ni débutant en c++, ni pro,je connais Qt et maintenant entrain de connaitre SFML.
    aujourd'hui entrain d'améliorer mon projet SFML, j'étais confus dans entre créér un constructeur avec des arguments infini(si c'est possible, je sais qu'il est possible avec les fonction) ou un tableau (comme int a[]) ou dynamique avec push.back...
    dans mon projet:
    qu'est ce que je peu faire?
    a- CollisionManager(Balle & ball, Bar & bar1, Bar & bar2, sf::Vector2u window_Size, obstacle::Obstacle,...);
    b- CollisionManager(Balle & ball, Bar & bar1, Bar & bar2, sf::Vector2u window_Size, obstacle::Obstacle[]);

    Note: 'Obstacle' est une classe abstraite

    merci pour votre aide
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Personnellement je crois qu'avoir une fonction quelconque avec plus que 4 ou 5 paramètre est une fonction à ne pas écrire. De plus, je ne voie pas l'utilité d'un fonction qui pourrais supporter un infinité de paramètre. Les structures sont là pour ça.

    Tu peux te définir une type avec un structure et recevoir cette structure en paramètre dans ta fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    typedef struct{
    Balle bal,
    Bar  bar1,
    sf::Vector2u window_Size,
    obstacle::Obstacle,
    ...,
    } TypeX;
     
    TypeX parametre;
     
    parametre.bal = quelquechose;
    parametre.bar1 = quelquechosedautre;
    ... ;
     
    //La déclaration
    CollisionManager(TypeX param);
     
    //L'utilisation
    CollisionManager(parametre);

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Tu peux regarder du côté des va_list (plutôt C) et du côté des templates (plutôt C++).

    Cf : http://www.cplusplus.com/forum/beginner/90610/

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le constructeur d'une classe n'est jamais qu'une fonction comme une autre, à ceci près que c'est une fonction qui est appelée au moment de la création de l'objet.

    Tu peux donc faire avec un constructeur tout ce que tu peux faire avec une autre fonction (tant que tu n'essayes pas de le rendre virtuel ou ami de ta classe).

    Cependant, l’utilisation de l'ellipse " ... " n'est vraiment pas recommandée, pour la simple et bonne raison qu'elle signifie " et le reste, dont je ne sais strictement rien (ni le type des arguments qui viendront ni leur nombre)".

    Même en adoptant un schéma de pensée plus proche du C que du C++, il faut avouer que le nombre de cas où il est intéressant de permettre à une fonction d'accepter un nombre inconnu d'argument de type inconnu est très fortement limité.

    C'est d'autant plus vrai pour le constructeur d'une classe car j'ai vraiment énormément de peine à imaginer la raison pour laquelle il pourrait être nécessaire de disposer d'un nombre inconnu d'arguments de type inconnus pour être en mesure d'initialiser un objet de telle manière à ce qu'il présente un état cohérent une fois créé (ce qui est, rappelons le, le but du constructeur )

    A titre personnel, cela fait plus de dix ans que je développe en C++, et je n'ai encore jamais été confronté à ce besoin , du moins sous cette forme.

    Après, il est vrai que C++11 est arrivé avec ce que l'on appelle les variadic template.

    Si le résultat est fort proche de l'utilisation de l'ellipse en C, c'est malgré tout une technique particulièrement très particulière et très qui permet d'obtenir quelque chose de très très générique, mais les cas d'utilisation de cette technique restent très limités malgré tout

    Je ne peux que confirmer les dires de moham104 (bien que l'exemple qu'il donne de la structure me déplaise énormément car trop "C style à mon gout) : tu peux déclarer une fonction avec autant de paramètres que tu le désires, mais il faut savoir que quatre à cinq paramètres, c'est le grand maximum "humainement gérable".

    Dés lors, pour répondre à tes questions:
    a - oui, tu peux le faire, mais je serais personnellement surpris que cela corresponde réellement à tes besoins
    b - oui, tu peux le faire aussi, mais je préférerais l'utilisation d'une collection de la stl comme std::vector (ou n'importe quelle autre) en lieu et place de ton obstacle::Obstacle[]. Cela te posera beaucoup moins de soucis
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci vos trois , je vais essayer avec std::vector...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    maintenant je suis bloqué dans ce complexe std::vector,
    j'ai pas pus itérer sur pour connaître s il y a une collision...
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void CollisionManager::ManageCollisionsX(bool &gamestate, bool &timemode)
    {
    	// Récupération de la boîte englobante de la balle
    	IntRect ballRect = myBall.getBoundingBox();
    	// Récupération des boîtes englobantes des barres
    	IntRect bar1Rect, bar2Rect;
    	bar1Rect = myBar1.GetBoundingBox();
    	bar2Rect = myBar2.GetBoundingBox();
    	// Test des Collisions en X
    	for (std::vector<obstacle::Obstacle>::iterator obs = monObstacle.begin(); obs != monObstacle.end(); ++obs)
    	{
    
    	}
    	if (Collision(ballRect, bar1Rect) || Collision(ballRect, bar2Rect)) // la collision
    	{
    		// On annule le mouvement de la balle et on lui inverse son mouvement en X
    		myBall.ReverseDX();
    		myBall.MoveX();
    	}
    
    }
    Le reste...
    }

    l'objectif est de transmettre chaque élément de ce objet en IntRect;

    voici ma version de GetBoundingBox() (pour RectangleObstacle)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    IntRect RectangleObstacle::GetBoundingBox() const
    {
    	IntRect boundingBox;
    	boundingBox.left = (int)carré.getPosition().x;
    	boundingBox.width = boundingBox.left + (int)carré.getSize().x;
    	boundingBox.top = (int)carré.getPosition().y;
    	boundingBox.height = boundingBox.top + (int)carré.getSize().y;
    	return boundingBox;
    }
    la classe Obstacle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Obstacle abstract :
    		public sf::Shape
    	{
    	public:
    		virtual ~Obstacle() = 0;
    		virtual sf::IntRect GetBoundingBox() const = 0;
    	private:
    	};
    merci pour votre aide

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Une autre nouveauté intéressante du C++11 pour ça est l'initializer_list avec l'initialisation uniforme. Tu peux l'utiliser directement ou indirectement.

    Par exemple, si ton constructeur prend en paramètre un vector<Point> et que Point prend en paramètre 2 doubles, tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClass a({{1,2},{4,3.2},{12,42}});
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    merci, je vais essayer

    mais ça ne m'aide pas dans la création de la classe :/

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Dans ta classe Obstacle, je vois du virtual. Ce qui semble dire qu'il faut la manier à l'aide de pointeurs. Or tu crées un vector<Obstacle>, et non pas un vector<Obstacle*>. Tu risques donc d'avoir des soucis.

    Sinon, je n'ai pas trop compris tes soucis...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (std::vector<obstacle::Obstacle>::iterator obs = monObstacle.begin(); obs != monObstacle.end(); ++obs)
    	{
                IntRect rect = obs->GetBoundingBox();
    	}
    Ou, une fois que tu seras passé à des pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (std::vector<obstacle::Obstacle>::iterator obs = monObstacle.begin(); obs != monObstacle.end(); ++obs)
    	{
                IntRect rect = (*obs)->GetBoundingBox();
    	}
    Ou, en version C++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (auto const &obs : monObstacle)
    	{
                auto rect = obs->GetBoundingBox();
    	}
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Cependant, l’utilisation de l'ellipse " ... " n'est vraiment pas recommandée,
    La traduction d'ellipsis par ellipse n'est vraiment pas recommandée (anglicisme).
    Préférer tout simplement "points de suspension".

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    tous vous m'avez donné n'ont pas marché :/ j'essayais milles fois, le programme fonctionne OK, mais pas de collision :/

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Alors, essayez de comprendre pourquoi cela ne marche pas en débogant, soit avec des print, soit avec le débogueur et des points d'arrêts.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je suis un peu géné de voir une hésitation entre des varargs/variadic template et un vector en paramètres de fonction...
    Soit la fonction doit prendre des paramètres optionnels dans leur nombre, voire leur type (printf, ..), soit elle prend un tableau d'éléments (tous identiques).
    Je ne vois même pas comment on peut avoir une telle hésitation.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    J'ai compris l'erreur,j'ai observé que la boucle For que vous me aviez donné n'a pas marché ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(auto const &obs : monObstacle)
    {
    auto rect = obs->GetBoundingBox;
    If(Collision(rect,myBall))
    {
      ReverseDX;
      MoveX;
    }
    std::cout << "It works!" << std::endl;
    }
    Le "cout" ne marche pas...

    aussi avec les statique quand je déclare dans la classe Collision Manager comme Private: obstacle::Obstacle* Obstacle[];
    alors le compilateur me dit Erreur : Type non complet.
    mais si ça ne marche pas mais pourquoi quand je fais char a[], ça marche ?

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Enfin je ça marche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/02/2007, 17h40
  2. Réponses: 4
    Dernier message: 09/01/2007, 21h50
  3. Réponses: 10
    Dernier message: 03/10/2006, 20h19
  4. Nombre d'arguments infini
    Par Sephiroth Lune dans le forum C++
    Réponses: 10
    Dernier message: 16/08/2006, 12h13
  5. [Débutant]Comment faire des tranches de nombre dans une tabl
    Par Jedecouvreaccess dans le forum Access
    Réponses: 7
    Dernier message: 05/09/2005, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo