Je voudrais créer une fonction avec un nombre variable de paramètres qui créer un QMenu et lui insère toutes les QAction données en paramètres.
Voiçi la base de la fonction :
void Programme::InitMenu (QMenu*& menu, const char* txt, QAction*& act)
{
menu = new QMenu (tr (txt), this);
menu -> addAction (act);
}
// qui s'utilise ainsi dans la classe Programme :
InitAction (m_action, "action", "icone.png", Qt::CTRL); // voir lien ci-dessous
InitMenu (m_menu, "menu", m_action);
// sachant qu'il y a dans les attributs :
QMenu *m_menu;
QAction *m_action;
Mais je vourdrais passer autant de QAction à la fonction InitMenu, donc cette fonction devra pouvoir recevoir un nombre variable d'arguments.
Le problème c'est que je ne sais pas du tout comment faire, donc si vous pouviez m'éclairer, ce serait super sympa !
Bah tu fait des boucles pour appeler autant de fois que nécéssaire la fonction InitMenu.
Pour donner les bon paramètres, comme ils sont codés en dur tu n'a qua les regrouper dans une struture genre InfoQAction, puis faire un tableau de InfoQAction pour passer chaque élémenet à InitMenu.
je plussois Nanoc sur les ellipses.
Ne jamais utiliser les ... dans le C++.
Il ya toujours des moyens d'éviter ca (chainage d'appels, ou boucle d'appel pour ce cas ci).
Par contre, utiliser plusieurs fonctions avec un nombre d'arguments différents, il ya plus évolutif comme méthode
J'ai jamais dit de void*
Dans son cas ca serait des QAction*, par exemple
Logiquement ça se tien je trouve on raisonne en disant :
- Tu vas me créer un menu avec cette liste d'action
Plutôt que de penser :
- Tu vas me créer un menu vide
- Tu vas ajouter cette action
- Puis celle là
- Et celle là
Et ça serait dans les cas les plus despérés, je pensais notemment lorsque qu'on à énormément d'appels de fonctions répetitif car.... un appel de fonction ça a un coût mine de rien
Ne soit pas paresseux... une suite de AddAction ce n'est pas la fin du monde dans ce type d'implémentation.
Personnellement j'utilise l'Ellipse régulièrement quand je veux gérer un cas d'exception locale mais que peu importe l'exception je veux la relancer.
void f()
{
int * p = new int( 0 );
try
{
// ...
g( p ); // fonction pouvant lancer une exception
// ...
}
catch( ... )
{
delete p;
throw; // relance l'exception pour qu'elle soit traitée plus loin.
}
}
@ Inki : Que ce soit AddAction() ou push_back() cela revient au même.
Oui en effet, si on veux optimiser le nombre d'appels (note: je sort completement du contexte de la génération du menu) on devrait passer par des tableaux C style ?
Je trouve que faire plusieurs fonctions avec un nombre différent d'arguments ou avec des paramètres optionnels, c'est un peu barbare et pas très optimisé ! De plus ce n'est pas super pour la réutilisation !
Les solutions à base de tableaux (par une boucle ou en passant le tableau directement en paramètre) me paraissent déjà plus avantageuses. C'est d'ailleurs la solution pour laquelle j'ai opté.
Mais si je vous ai parlé des ellipses, ce n'était pas juste pour réussir ma fonction ; c'était aussi pour découvrir un nouveau concept du C++ ! Je suis encore débutant (ca fait qu'un an et demi que je programme) donc j'aimerais bien en apprendre encore davantage !
Je me souviens avoir vu dans un exercice (que je n'ai malheureusement pas retrouvé ) une classe qui avait une méthode permettant d'additionner des nombres dans un autre ainsi (ce n'était qu'un exercice, la fonction n'a aucune utilité ) :
Ben cela ne marche toujours pas, il y a la même erreur que tout à l'heure, sauf qu'en plus il dit que la surcharge de l'opérateur << ne doit prendre qu'un paramètre !
Ben ce n'est pas un extrait d'un de mes codes et avant de pouvoir traiter QAction, QMenu et separator, j'attend d'avoir déjà une fonction qui marche qu'avec des QAction !
En fait j'ai trouvé d'où vient le problème avec ma classe : je surcharge << comme si je devais "écrire" dans une variable mais en fait j'écrit dans un pointeur (bon ce ne sont peut etre pas les bon termes, mais c'est comprehensible).
Merci beaucoup à vous tous piur votre participation à cette discussion !
La classe fonctionne parfaitement (j'utilise le défèrencement : (*menu) << action1 << ...), c'est exactement ce que j'attendais !
Encore merci beaucoup et à bientot !
Créer une fonction avec un nombre variable d'arguments
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
compilera sans doute mieux car operator << est binaire.