web-dev-qa-db-fra.com

Struct Constructor en C ++?

Un struct peut-il avoir un constructeur en C++?

J'ai essayé de résoudre ce problème mais je ne comprends pas la syntaxe.

325
Jay

En C++, la seule différence entre un class et un struct est que les membres et les classes de base sont privés par défaut dans les classes, alors qu'ils sont publics par défaut dans les structures.

Ainsi, les structures peuvent avoir des constructeurs et la syntaxe est la même que pour les classes.

432
sth
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};
152
nos

Toutes les réponses ci-dessus répondent techniquement à la question du demandeur, mais je pensais juste que je signalerais 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 pour essayer de déclarer un constructeur. C'est bien sûr parce que vous n'avez pas réellement déclaré de structure nommée "foo", vous avez créé une structure anonyme et lui avez attribué l'alias "foo". Cela signifie également que vous ne pourrez pas utiliser "foo" avec un opérateur de cadrage 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 procéder comme suit:

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

ou ca:

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

Où ce dernier crée une structure appelée "foo" et lui donne le pseudonyme "foo" afin que vous n'ayez pas à utiliser le mot clé struct pour le référencer.

36
gitarooLegend

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

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

Les syndicats n'autoriseront pas les constructeurs dans les structures. Vous pouvez cependant faire un constructeur sur l'union. Cette question concerne les constructeurs non triviaux dans les syndicats.

33
Chap

Comme le mentionnent les autres réponses, une structure est fondamentalement traitée 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. En dessous, le constructeur utilise 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) {}
};

Usage:

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

Oui. Une structure est comme une classe, mais par défaut, public:, dans la définition de la classe et lors de l'héritage:

struct Foo
{
    int bar;

    Foo(void) :
    bar(0)
    {
    }
}

Compte tenu de votre autre question, je vous suggère de lire quelques tutoriels . Ils répondront à vos questions plus rapidement et plus complètement que nous.

15
GManNickG
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

Je préfère initialiser à l'intérieur du constructeur pour ne pas avoir à respecter l'ordre.

12
SwDevMan81

Notez qu'il existe une différence intéressante (au moins avec le compilateur MS C++):


Si vous avez un struct plain vanille comme celui-ci

struct MyStruct {
   int id;
   double x;
   double y;
} MYSTRUCT;

alors, ailleurs, vous pourriez initialiser un tableau d'objets comme celui-ci:

MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};

cependant, dès que vous ajoutez à MyStruct un constructeur défini par l'utilisateur, comme ceux décrits ci-dessus, vous obtenez une erreur comme celle-ci:

    'MyStruct' : Types with user defined constructors are not aggregate
     <file and line> : error C2552: '_pointList' : non-aggregates cannot 
     be initialized with initializer list.

Donc, c'est au moins une autre différence entre une structure et une classe. Ce type d’initialisation n’est peut-être pas une bonne pratique OO, mais il est omniprésent dans le code WinSDK c ++ hérité que je gère. Juste pour que vous sachiez ...

11
Steve L

La classe, la structure et l'union sont décrites dans le tableau ci-dessous.

enter image description here

11
Saurabh Raoot

Oui, les structures et les classes en C++ sont identiques, sauf que les membres de structures sont publics par défaut, alors que les membres de classes sont privés par défaut. Tout ce que vous pouvez faire dans une classe, vous devriez pouvoir le faire dans une structure.

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};
11
heavyd

Dans c ++ struct et c ++ class n'ont qu'une différence par défaut, les membres de la structure sont publics et les membres de la classe sont privés.

/*Here, C++ program constructor in struct*/ 
#include <iostream>
using namespace std;

struct hello
    {
    public:     //by default also it is public
        hello();    
        ~hello();
    };

hello::hello()
    {
    cout<<"calling constructor...!"<<endl;
    }

hello::~hello()
    {
    cout<<"calling destructor...!"<<endl;
    }

int main()
{
hello obj;      //creating a hello obj, calling hello constructor and destructor 

return 0;
}
9
Kulamani

Oui, il est possible d'avoir un constructeur en structure, voici un exemple:

#include<iostream.h> 
struct a {
  int x;
  a(){x=100;}
};

int main() {
  struct a a1;
  getch();
}
5
Rajesh Thakur

La syntaxe est la même que celle de la classe en C++. Si vous êtes conscient de la création d'un constructeur dans c ++, il en est de même dans la structure.

struct Date
{
int day;

Date(int d)
{
    day = d;
}
void printDay()
{
    cout << "day " << day << endl;
}

};

Struct peut avoir toutes les choses en tant que classe en c ++. Comme précédemment, la différence réside uniquement dans le fait que, par défaut, les membres C++ ont un accès privé, mais leur structure est publique.Mais en fonction de la programmation Utilisez le mot-clé struct pour les structures contenant uniquement des données. Utilisez le mot-clé class pour les objets contenant à la fois des données et des fonctions.

5
sitaram chhimpa

En C++, les deux struct & class sont égaux, sauf struct'sdefault le spécificateur d'accès aux membres est public & la classe a private.

La raison pour laquelle struct en C++ est C++ est un sur-ensemble de C et doit être compatible avec legacy C types.

Par exemple, si l'utilisateur de langue essaie d'inclure un fichier d'en-tête C legacy-c.h dans son code C++ et qu'il contient struct Test {int x,y};. Les membres de struct Test devraient être accessibles comme C.

5

Encore un exemple, mais en utilisant le mot clé this lors de la définition de la valeur dans le constructeur:

#include <iostream>

using namespace std;

struct Node {
    int value;

    Node(int value) {
        this->value = value;
    }

    void print()
    {
        cout << this->value << endl;
    }
};

int main() {
    Node n = Node(10);
    n.print();

    return 0;
}

Compilé avec GCC 8.1.0.

3
Luka Lopusina

En C++, nous pouvons déclarer/définir la structure de la même manière que class et disposer des constructeurs/destructeurs pour les structures et y définir des variables/fonctions. La seule différence est la portée par défaut des variables/fonctions définies. Outre la différence ci-dessus, vous devriez pouvoir imiter la fonctionnalité de classe à l'aide de structures.

1
Roopesh Majeti