10
votes

Un moyen simple de passer la structure temporaire par la valeur en C ++?

Supposons que je veux transmettre un objet temporaire dans une fonction. Existe-t-il un moyen de le faire dans 1 ligne de code vs. 2, avec une structure?

avec une classe, je peux faire: p> xxx pré>

donné : P>

struct test_struct
{
    int a;
    short b;
};

void struct_func(const test_struct & a_struct)
{
    printf("%d %d\n", a_struct.a, a_struct.b);
}


2 commentaires

Vous pouvez toujours écrire un constructeur en gardant les variables des membres publics. Donc, vous n'avez pas besoin de méthodes get / définies. Y a-t-il un problème dans cela?


Voulez-vous dire pour atteindre l'initialisation des structures en C? En C ++, une structure peut également faire ce que vous faites dans la classe.


5 Réponses :


0
votes

Je ne suis pas expert en C ++, mais ne pouvez-vous pas simplement placer la déclaration de création dans la liste des arguments de votre appel de fonction?


1 commentaires

Non, certains compilateurs permettent ce genre de chose et c'est en C ++ 0x (§5.2.3 / 3), mais ce n'est pas la norme actuelle.



2
votes

Vous pouvez le faire de la même manière que vous le faites avec la classe. Donnez simplement à votre structure un constructeur et vous pouvez le créer en ligne comme la structure. Vos objections sur l'utilisation d'un constructeur ne sont pas fondées. La principale différence entre une classe et une structure est la visibilité par défaut associée à celle-ci. Pour les cours, c'est privé; Pour les structures, le public. Il n'y a pas de "chaudière" et vous n'avez pas besoin d'obéir à des "conventions" que vous ne voulez pas. XXX


2 commentaires

@Terry Mahaffey, vous pouvez définitivement utiliser l'initialisation de la corset avec une classe. Les contraintes sont les mêmes que pour la structure. La différence entre struct et class est la visibilité par défaut seulement (pour les membres et les classes de base). Vous pouvez même mélanger les mots-clés: struct t {}; Classe t v; .


Oui, tu as raison. Je pensais que seules les structures pourraient être des pods pour une raison quelconque. Je retire mon commentaire



0
votes

Les structures peuvent également avoir des constructeurs afin de pouvoir faire la même chose avec eux que vous faites avec l'exemple de classe.


0 commentaires

7
votes

Ceci est possible dans le C ++ 11 standard . Fondamentalement, vous pouvez faire cela:

struct_func(test_struct{5, 7});


1 commentaires

En fait, vous n'avez même pas besoin de déclarer explicitement le type, à moins qu'il n'y ait aucune ambiguïté sur les types pouvant être créés par la liste des init de la BRACED: #include structure s {int i; Double D; }; Void f (s s s) {std :: COUT << S.I << '' << S.D << STD :: endl; } int main (int, char * **) {f ({7, 42}); } Je ne pense pas que je n'aurais jamais eu d'une initialisation uniforme ou de toutes les autres mises à niveau massives effectuées en C ++ 11 que je prenais complètement pour acquis.



8
votes

Une alternative à la fourniture d'un constructeur dans votre structure serait de fournir une fonction gratuite make_xxx: xxx

une raison pour laquelle vous voudrez peut-être éviter les constructeurs dans les structures consiste à autoriser l'initialisation de la corset Dans les matrices de structures: xxx

vs xxx


1 commentaires

Notez qu'en C ++ 11, l'utilisation peut utiliser l'initialisation de la corset, même si le constructeur le point est défini. Dans ce cas, les arguments dans les accolades seront transmis au constructeur. Cette fonctionnalité s'appelle Initialisation uniforme .