Structconstructor in C++?

Kan een structeen constructor hebben in C++?

Ik heb geprobeerd dit probleem op te lossen, maar ik krijg de syntaxis niet.


Antwoord 1, autoriteit 100%

In C++ is het enige verschil tussen een classen een structdat leden en basisklassen standaard privé zijn in klassen, terwijl ze standaard openbaar zijn in structs.

Structs kunnen dus constructors hebben en de syntaxis is hetzelfde als voor klassen.


Antwoord 2, autoriteit 36%

struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};

Antwoord 3, autoriteit 10%

Alle bovenstaande antwoorden zijn technisch een antwoord op de vraag van de vraagsteller, maar ik wilde u even wijzen op een geval waarin u mogelijk problemen zou kunnen ondervinden.

Als je je structuur als volgt declareert:

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

U zult problemen ondervinden bij het declareren van een constructor. Dit komt natuurlijk omdat je niet echt een struct met de naam “foo” hebt gedeclareerd, je hebt een anonieme struct gemaakt en deze de alias “foo” gegeven. Dit betekent ook dat u “foo” niet kunt gebruiken met een scoping-operator in een cpp-bestand:

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...
}

Om dit op te lossen, moet je dit doen:

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

of dit:

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

Waarbij de laatste een struct maakt met de naam “foo” en deze de alias “foo” geeft, zodat u het sleutelwoord structniet hoeft te gebruiken wanneer u ernaar verwijst.


Antwoord 4, autoriteit 7%

Ja, maar als je je structuur in een vakbond hebt, dan kan dat niet. Het is hetzelfde als een klas.

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

Unions staan geen constructors toe in de structs. Je kunt wel een constructor maken op de unie. Deze vraag heeft betrekking op niet-triviale constructors in vakbonden.


Antwoord 5, autoriteit 6%

Klasse, Structuur en Unie wordt in onderstaande tabel in het kort beschreven.

voer hier de afbeeldingsbeschrijving in


Antwoord 6, autoriteit 6%

Zoals de andere antwoorden vermelden, wordt een struct in C++ als een klasse behandeld. Dit stelt je in staat om een constructor te hebben die kan worden gebruikt om de struct te initialiseren met standaardwaarden. Hieronder neemt de constructor szen bals argumenten, en initialiseert de andere variabelen naar enkele standaardwaarden.

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

Gebruik:

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

Antwoord 7, autoriteit 3%

Ja. Een structuur is net als een klasse, maar is standaard public:, in de klassedefinitie en bij overerven:

struct Foo
{
    int bar;
    Foo(void) :
    bar(0)
    {
    }
}

Gezien uw andere vraag, raad ik u aan enkele tutorialsdoor te lezen. Zij zullen uw vragen sneller en vollediger beantwoorden dan wij.


Antwoord 8, autoriteit 3%

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

Ik initialiseer liever binnen de constructor, zodat ik de volgorde niet hoef te behouden.


Antwoord 9, autoriteit 3%

In c++ structen c++ classhebben standaard slechts één verschil structleden zijn openbaar en klasleden zijn privé.

/*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;
}

Antwoord 10, autoriteit 2%

Merk op dat er één interessant verschil is (tenminste met de MS C++ compiler):


Als je zo’n duidelijke vanillestructuur hebt

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

dan zou je ergens anders een array van dergelijke objecten als volgt kunnen initialiseren:

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

echter, zodra u een door de gebruiker gedefinieerde constructor toevoegt aan MyStruct, zoals degene die hierboven zijn besproken, krijgt u een foutmelding als deze:

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

Dus dat is minstens één ander verschil tussen een struct en een klasse. Dit soort initialisatie is misschien geen goede OO-praktijk, maar het komt overal voor in de oude WinSDK c++-code die ik ondersteun. Zodat je het weet…


Antwoord 11, autoriteit 2%

Ja, structuren en klassen in C++ zijn hetzelfde, behalve dat structuurleden standaard openbaar zijn, terwijl klassenleden standaard privé zijn. Alles wat je in een klas kunt doen, moet je ook in een structuur kunnen doen.

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

Antwoord 12, autoriteit 2%

Nog een voorbeeld, maar met ditzoekwoord bij het instellen van waarde in constructor:

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

Samengesteld met GCC 8.1.0.


Antwoord 13, autoriteit 2%

Syntaxis is hetzelfde als van klasse in C++. Als je je bewust bent van het maken van een constructor in c++, dan is het hetzelfde in struct.

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

Struct kan alle dingen als klasse hebben in c++. Zoals eerder genoemd verschil is alleen dat C++ -leden standaard privétoegang hebben, maar in struct is het openbaar. Maar volgens programmeringsoverweging Gebruik het struct-sleutelwoord voor alleen-gegevensstructuren. Gebruik het trefwoord class voor objecten die zowel gegevens als functies hebben.


Antwoord 14

Ja, het is mogelijk om een constructor in structuur te hebben, hier is een voorbeeld:

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

Antwoord 15

In C++ zowel structals; classzijn gelijk, behalve dat struct'sstandaard specificatie voor ledentoegang publicis & klas heeft private.

De reden voor het hebben van structin C++ is dat C++ een superset is van C en achterwaarts compatibel moet zijn met legacy C types.

Bijvoorbeeld als de taalgebruiker probeert een C-headerbestand legacy-c.hop te nemen in zijn C++-code & het bevat struct Test {int x,y};. Leden van struct Testmoeten toegankelijk zijn als C.


Antwoord 16

In C++ kunnen we de structuur declareren/definiëren net als klasse en de constructors/destructors voor de structuren hebben en variabelen/functies erin hebben gedefinieerd.
Het enige verschil is het standaardbereik van de gedefinieerde variabelen/functies.
Afgezien van het bovenstaande verschil, zou je meestal in staat moeten zijn om de functionaliteit van klasse te imiteren met behulp van structs.

Other episodes