Construtor de estruturas em C++?

Um struct pode ter um construtor em C++?

Tenho tentado resolver este problema, mas não consigo a sintaxe.

Author: 8 revs, 6 users 40%Jay , 2009-07-14

16 answers

Em C++, a única diferença entre um class e um struct é que os membros e classes de base são privados por defeito nas classes, enquanto que são públicos por defeito nas estruturas.

As estruturas podem ter construtores, e a sintaxe é a mesma das classes.

 385
Author: sth, 2014-09-10 07:35:05
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};
 132
Author: nos, 2009-07-14 19:14:13
Sim,mas se tem a sua estrutura numa União, então não pode. É o mesmo que uma aula.
struct Example
{
   unsigned int mTest;
   Example()
   {
   }
};
Os sindicatos não permitirão Construtores nas estruturas. Mas podes fazer um construtor no Sindicato. Esta questão diz respeito a Construtores não triviais em sindicatos.
 31
Author: Chap, 2017-05-23 11:54:59
Todas as respostas acima respondem tecnicamente à pergunta do asker, mas pensei em apontar um caso onde você pode encontrar problemas.

Se declarar a sua estrutura assim:

typedef struct{
int x;
foo(){};
} foo;
Vais ter problemas em declarar um construtor. Isto é claro porque você não declarou uma estrutura chamada "foo", você criou uma estrutura anônima e atribuiu-lhe o pseudônimo"foo". Isso também significa que você não será capaz de usar " foo " com um operador de escopo em um ficheiro 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...
}

Para resolver isto, tens de fazer isto:

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

Ou isto:

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

Onde este último cria uma estrutura chamada "foo" e lhe dá o pseudónimo "foo" para que não tenha de usar a palavra-chave struct ao referenciá-la.

 29
Author: gitarooLegend, 2013-01-15 23:34:19

Como as outras respostas mencionam, uma estrutura é basicamente tratada como uma classe em C++. Isso permite que você tenha um construtor que pode ser usado para inicializar a estrutura com valores padrão. Abaixo, o construtor toma sz e b como argumentos, e inicializa as outras variáveis para alguns valores predefinidos.

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) {}
};

Utilização:

unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);
 22
Author: inspectahdeck, 2013-04-29 15:02:54
Sim. Uma estrutura é como uma classe, mas por omissão é public:, na definição de classe e ao herdar:
struct Foo
{
    int bar;

    Foo(void) :
    bar(0)
    {
    }
}
Considerando a sua outra pergunta, sugiro que leia alguns tutoriais. Responderão às suas perguntas mais depressa e mais completas do que nós.
 14
Author: GManNickG, 2009-07-14 19:15:21
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};
Prefiro inicializar dentro do construtor para não ter de manter a ordem.
 12
Author: SwDevMan81, 2009-09-20 19:39:00

As estruturas e classes Sim Em C++ são as mesmas, excepto que os membros das estruturas são públicos por omissão, enquanto os membros das classes são privados por omissão. Qualquer coisa que você pode fazer em uma classe você deve ser capaz de fazer em uma estrutura.

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};
 11
Author: heavyd, 2009-07-14 19:15:31

Note que existe uma diferença interessante (pelo menos com o compilador em C++):


Se tiver uma estrutura de baunilha simples como esta

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

Então em algum outro lugar você pode inicializar um conjunto de tais objetos como este:

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

No entanto, assim que adicionar um construtor definido pelo utilizador à minha estrutura, como os mencionados acima, obterá um erro como este:

    'MyStruct' : Types with user defined constructors are not aggregate
     <file and line> : error C2552: '_pointList' : non-aggregates cannot 
     be initialized with initializer list.
Então isso é pelo menos uma outra diferença entre uma estrutura e uma estrutura. classe. Este tipo de inicialização pode não ser uma boa prática OO, mas aparece em todo o lugar no código C++ WinSDK legado que eu apoio. Só para que saibas...
 9
Author: Steve L, 2014-03-07 20:47:22

Em C++ struct e C++ class têm apenas uma diferença, por omissão, os membros da estrutura são públicos e os membros da classe são privados.

/*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;
}
 8
Author: Kulamani, 2015-08-21 11:39:46

Sim, é possível ter o construtor na estrutura aqui é um exemplo:

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

int main() {
  struct a a1;
  getch();
}
 5
Author: Flexo, 2011-10-10 08:18:12

Em C++ ambos struct & class são iguais, excepto struct's o utilizador de acesso por omissão é public e a classe tem private.

A razão para ter struct em C++ é que o C++ é um superconjunto de C e deve ser compatível com legacy C types.

Por exemplo, se o Utilizador da língua tentar incluir algum ficheiro de cabeçalho C legacy-c.h no seu código C++ e contiver struct Test {int x,y};. Os membros de struct Test devem ser acessíveis como C.

 5
Author: Arunprasad Rajkumar, 2014-04-01 18:31:08

A sintaxe é igual à da classe em C++. Se você está ciente de criar o construtor em c++, então ele é o mesmo em struct.

struct Date
{
int day;

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

};

O Struct pode ter todas as coisas como classe em C++. Como disse anteriormente, a diferença é apenas que por padrão membro C++ tem acesso privado, mas na struct é público.Mas, de acordo com a consideração de programação, Use a palavra-chave struct para estruturas somente de dados. Use a palavra-chave de classe para objetos que têm dados e funções.

 2
Author: sitaram chhimpa, 2017-05-16 15:18:33

Em C++, podemos declarar/definir a estrutura tal como a classe e ter os construtores/destruidores para as estruturas e ter variáveis / funções definidas nela. A única diferença é o escopo padrão das variáveis/funções definidas. Além da diferença acima, na maioria das vezes você deve ser capaz de imitar a funcionalidade da classe usando estruturas.

 1
Author: Roopesh Majeti, 2009-07-14 19:36:33

Mais um exemplo, mas usando esta palavra-chave ao definir o valor no construtor:

#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;
}

Compilado com GCC 8.1.0.

 1
Author: Luka Lopusina, 2018-07-01 16:06:28

Em Resumo, A classe, A estrutura e a União estão descritas no quadro seguinte.

enter image description here

 1
Author: Saurabh Raoot, 2018-08-08 09:42:36