wake-up-neo.net

Strukturkonstruktor in C ++?

Kann ein struct einen Konstruktor in C++ haben?

Ich habe versucht, dieses Problem zu lösen, aber ich erhalte die Syntax nicht.

325
Jay

In C++ besteht der einzige Unterschied zwischen einem class und einem struct darin, dass Mitglieder und Basisklassen in Klassen standardmäßig privat sind, während sie in Strukturen standardmäßig öffentlich sind.

Strukturen können also Konstruktoren haben, und die Syntax ist dieselbe wie für Klassen.

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

Alle obigen Antworten beantworten technisch die Frage des Fragestellers, aber ich wollte nur auf einen Fall hinweisen, in dem Sie auf Probleme stoßen könnten.

Wenn Sie Ihre Struktur folgendermaßen deklarieren:

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

Sie werden Probleme haben, einen Konstruktor zu deklarieren. Dies liegt natürlich daran, dass Sie keine Struktur mit dem Namen "foo" deklariert haben. Sie haben eine anonyme Struktur erstellt und ihr den Alias ​​"foo" zugewiesen. Dies bedeutet auch, dass Sie "foo" nicht mit einem Scoping-Operator in einer CPP-Datei verwenden können:

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

Um dies zu beheben, müssen Sie entweder dies tun:

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

oder dieses:

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

Wobei letzterer eine Struktur namens "foo" erstellt und ihr den Alias ​​"foo" gibt, damit Sie das struct-Schlüsselwort nicht verwenden müssen, wenn Sie darauf verweisen.

36
gitarooLegend

Ja, aber wenn Sie Ihre Struktur in einer Gewerkschaft haben, können Sie nicht. Es ist dasselbe wie eine Klasse.

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

Unions erlauben keine Konstruktoren in den Strukturen. Sie können jedoch einen Konstruktor für die Union erstellen. Diese Frage bezieht sich auf nicht-triviale Konstruktoren in Gewerkschaften.

33
Chap

Wie in den anderen Antworten erwähnt, wird eine Struktur in C++ grundsätzlich als Klasse behandelt. Dies ermöglicht Ihnen einen Konstruktor, mit dem Sie die Struktur mit Standardwerten initialisieren können. Im Folgenden verwendet der Konstruktor sz und b als Argumente und initialisiert die anderen Variablen mit einigen Standardwerten.

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

Verwendungszweck:

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

Ja. Eine Struktur ist wie eine Klasse, hat jedoch standardmäßig den Wert public: in der Klassendefinition und beim Erben von:

struct Foo
{
    int bar;

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

In Anbetracht Ihrer anderen Frage empfehle ich Ihnen, einige Tutorials durchzulesen. Sie werden Ihre Fragen schneller und vollständiger beantworten als wir.

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

Ich möchte lieber im Konstruktor initialisieren, damit ich die Reihenfolge nicht beibehalten muss.

12
SwDevMan81

Beachten Sie, dass es einen interessanten Unterschied gibt (zumindest beim MS C++ - Compiler):


Wenn Sie eine einfache Vanille-Struktur wie diese haben

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

dann könnten Sie an einer anderen Stelle ein Array solcher Objekte wie das folgende initialisieren:

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

sobald Sie MyStruct jedoch einen benutzerdefinierten Konstruktor wie den oben beschriebenen hinzufügen, wird eine Fehlermeldung wie die folgende angezeigt:

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

Das ist also mindestens ein weiterer Unterschied zwischen einer Struktur und einer Klasse. Diese Art der Initialisierung ist möglicherweise keine gute OO Übung, aber sie erscheint überall im von mir unterstützten WinSDK c ++ - Legacy-Code. Nur damit du weißt ...

11
Steve L

Klasse, Struktur und Union sind in der folgenden Tabelle kurz beschrieben.

enter image description here

11
Saurabh Raoot

Ja, Strukturen und Klassen in C++ sind identisch, mit der Ausnahme, dass Strukturmitglieder standardmäßig öffentlich sind, während Klassenmitglieder standardmäßig privat sind. Alles, was Sie in einer Klasse tun können, sollten Sie in einer Struktur tun können.

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

In c ++ struct und c ++ class gibt es nur einen Unterschied. Standardmäßig sind Strukturmitglieder öffentlich und Klassenmitglieder privat.

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

Ja, hier ist ein Beispiel für die Möglichkeit, einen Konstruktor in der Struktur zu haben:

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

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

Die Syntax entspricht der von class in C++. Wenn Sie wissen, dass Sie einen Konstruktor in c ++ erstellen, ist dies auch in struct der Fall.

struct Date
{
int day;

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

};

Struct kann in c ++ alle Dinge als Klasse haben. Wie bereits erwähnt, besteht der Unterschied nur darin, dass C++ - Mitglieder standardmäßig privaten Zugriff haben, in struct jedoch public.But gemäß Programmierüberlegung Verwenden Sie das struct-Schlüsselwort für reine Datenstrukturen. Verwenden Sie das Schlüsselwort class für Objekte, die sowohl Daten als auch Funktionen enthalten.

5
sitaram chhimpa

In C++ sind beide struct & class gleich, mit der Ausnahme, dass struct'sdefault member access specifier public & class private ist.

Der Grund für struct in C++ ist, dass C++ eine Obermenge von C ist und abwärtskompatibel mit legacy C types sein muss.

Wenn der Sprachbenutzer beispielsweise versucht, eine C-Header-Datei legacy-c.h in seinen C++ - Code aufzunehmen, enthält sie struct Test {int x,y};. Mitglieder von struct Test sollten wie C erreichbar sein.

5

Noch ein Beispiel, aber mit dem Schlüsselwort this beim Setzen des Werts im Konstruktor:

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

Kompiliert mit GCC 8.1.0.

3
Luka Lopusina

In C++ können wir die Struktur genau wie eine Klasse deklarieren/definieren und die Konstruktoren/Destruktoren für die Strukturen und die darin definierten Variablen/Funktionen haben. Der einzige Unterschied ist der Standardumfang der definierten Variablen/Funktionen. Abgesehen von dem oben genannten Unterschied sollten Sie in der Lage sein, die Funktionalität von Klassen mithilfe von Strukturen zu imitieren.

1
Roopesh Majeti