504 votes

Constructeur de structure en C++ ?

Est-ce qu'un struct ont un constructeur en C++ ?

J'ai essayé de résoudre ce problème mais je n'arrive pas à obtenir la syntaxe.

620voto

sth Points 91594

En C++, la seule différence entre un class et un struct est que les membres et les classes de base sont par défaut privés dans les classes, alors que dans les structures ils sont par défaut publics. Les structures peuvent donc avoir des constructeurs, et la syntaxe est la même que pour les classes.

87 votes

Et que les structures seront par défaut publiques lorsqu'elles seront dérivées de :)

2 votes

@sth Vous avez raison sur la différence entre struct et class, cependant je pense qu'il a un problème de compilation. Le problème peut être dû à une union qui utilise la structure. Vous ne pouvez pas avoir de constructeurs non triviaux dans le type que vous avez dans une union.

2 votes

@Chap : S'il a des problèmes concrets où la solution générale ne fonctionne pas, ce serait probablement la meilleure idée de poster du code qui montre le problème et les erreurs de compilation qui sont générées. Mais vu que la question est posée de manière générale, je ne pense pas que l'on puisse en déduire grand chose sur le problème concret que le PO essaie de résoudre...

218voto

nos Points 102226
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};

73 votes

Quel est le : id(42) partie appelée ?

120 votes

@user13107 : " liste d'initialisation "est le mot que vous recherchez.

7 votes

Cela ne fonctionnera pas si vous héritez d'une autre classe et que la variable est déchargée dans la classe parente.

66voto

gitarooLegend Points 11

Toutes les réponses ci-dessus répondent techniquement à la question de l'auteur de la demande, mais j'ai pensé qu'il fallait signaler un cas où vous pourriez rencontrer des problèmes.

Si vous déclarez votre structure comme ceci :

typedef struct{
int x;
foo(){};
} foo;

Vous aurez des problèmes en essayant de déclarer un constructeur. C'est bien sûr parce que vous n'avez pas réellement déclaré une structure nommée "foo", vous avez créé une structure anonyme et lui avez attribué l'alias "foo". Cela signifie également que vous ne serez pas en mesure d'utiliser "foo" avec un opérateur de scoping dans un fichier cpp :

foo.h :

typedef struct{
int x;
void myFunc(int y);
} foo;

foo.cpp :

//<-- This will not work because the struct "foo" was never declared.
void foo::myFunc(int y)
{
  //do something...
}

Pour résoudre ce problème, vous devez soit faire ceci :

struct foo{
int x;
foo(){};
};

ou ceci :

typedef struct foo{
int x;
foo(){};
} foo;

Alors que cette dernière crée une structure appelée "foo" et lui donne l'alias "foo" afin que vous n'ayez pas à utiliser l'attribut struct lorsqu'on y fait référence.

0 votes

Qu'en est-il lorsque : typedef struct foo{ int x ; foo(int x){} ; }foo ; foo::foo(int x){...} ; cela ne fonctionne pas....

0 votes

Vous pouvez également définir : struct foo{ int x; foo(){}; }; et ensuite : typedef struct foo foo;

44voto

luqmaan Points 720

Comme le mentionnent les autres réponses, un struct est traité comme une classe en C++. Cela vous permet d'avoir un constructeur qui peut être utilisé pour initialiser la structure avec des valeurs par défaut. Ci-dessous, le constructeur prend sz et b comme arguments, et initialise les autres variables à certaines valeurs par défaut.

struct blocknode
{
    unsigned int bsize;
    bool free;
    unsigned char *bptr;
    blocknode *next;
    blocknode *prev;

    blocknode(unsigned int sz, unsigned char *b, bool f = true,
              blocknode *p = 0, blocknode *n = 0) :
              bsize(sz), free(f), bptr(b), prev(p), next(n) {}
};

Utilisation :

unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);

4 votes

Pas seulement "traité comme" ... le mot-clé struct crée littéralement une classe. Période.

37voto

Chap Points 1846

Oui, mais si vous avez votre structure dans un syndicat, vous ne pouvez pas. C'est la même chose qu'une classe.

struct Example
{
   unsigned int mTest;
   Example()
   {
   }
};

Les unions n'autorisent pas les constructeurs dans les structs. Vous pouvez cependant créer un constructeur sur l'union. Cette question concerne les constructeurs non triviaux dans les unions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X