Struct Konstruktor



  • Hey Leute,
    ich wollte ein Programm schreiben mit einem "struct" gebilde.
    So und nun ist mir aufgefallen das ich dich Variablen nicht innerhalb Initialisieren kann. Dann bin ich auf die Suche gegangen und habe recht schnell etwas gefunden (mit einem Konstruktor).

    Nun meine Fragen:
    1. Hat jemand einen nützlichen Link wo der Konstruktor für ein "struct" verwendet wird? 😮
    2. Ich habe hier einen Link: http://www.java2s.com/Code/Cpp/Class/Constructoranddestructorinsideastruct.htm und dort ist auch ein "struct" aber dies sieht aus wie ein "class" Objekt. Kann mir das jemand erklären? 🙂

    Gruß

    Und ich habe keine Ahnung wie man das schreibt(einen struct, ein struct, eine struct, ...) :p



  • struct und class sind bis auf Default-Sichtbarkeit von Membern und Basisklassen identisch.



  • Und es gibt die Möglichkeit Stucts ohne expliziten Konstruktor zu initialisieren:

    #include <string>
    
    struct X
    {
    	int i;
    	double d;
    	std::string s;
    };
    
    int main()
    {
    	X x{5, 3.14, "foo"};
    	return 0x0;
    }
    


  • Okay danke für die Antworten 😃
    Dürfte ich trodzdem mal ein Beispiel mit einem Konstrutor sehen?

    Und ich habe nun weiter gemacht, und schon wieder ein Problem 😡

    void e_name(string name);
    
    int main(){
        struct{
            string name;
        }spieler;
        e_name(spieler.name);
        cout << spieler.name; // Warum steht hier nichts?
        return 0;
    }
    
    void e_name(string name){
            cout << "Bitte den Namen eintragen.\n"
                 << "Name: ";
            cin  >> name;
    }
    

    Frage steht im Code.



  • Wie da steht nix?! oO

    Da steht doch cout... ?!

    Skeptar schrieb:

    Dürfte ich trodzdem mal ein Beispiel mit einem Konstrutor sehen?

    struct /*oder class, ist bis auf die default-Sichtbarkeit egal*/ MyStructClassDing
    {
    private:
    	int i;
    	double d;
    
    public:
    	// das ist der Konstruktor
    	MyStructClassDing(int i = 0, double d = 0.0)
    	 : i(i), d(d)
    	{ }
    };
    

    Aber hier kommen mehrere Dinge wie Initialisierungsliste, Überschriebener Standardkonstruktor, Defaultparameter und so weiter noch vor.
    Der einfachste Konstrukto wäre:

    struct MyStructClassDing
    {
    private:
    	int i;
    	double d;
    
    public:
    	MyStructClassDing()	{ }
    };
    

    Und der macht ... ... nix!



  • Skeptar schrieb:

    cout << spieler.name; // Warum steht hier
    

    Weil du nur etwas in eine Kopie geschrieben hast.
    Du solltest es mal mit nem anständigen Buch versuchen, so wird das nichts.



  • Ist Manni66=manni66?



  • Um noch etwas genauer zu sein

    class -> Standardmäßig private
    struct -> Standardmäßig public

    mfg



  • Manni66 schrieb:

    Skeptar schrieb:

    cout << spieler.name; // Warum steht hier
    

    Weil du nur etwas in eine Kopie geschrieben hast.
    Du solltest es mal mit nem anständigen Buch versuchen, so wird das nichts.

    Danke für das Kommentar 🙂
    Bin auf die Lösung gekommen. Musste es als Referenz bezeichnen.

    Also ich habe ein Buch (Der C++ Programmierer) und der wurde mir hier auch empfohlen.

    Und für die Erklärungen auch danke 🙂



  • Sry für ein Doppelpost. Aber mir ist das mit dem "struct" noch nicht ganz klar.

    Bei einer "class" kann man die in dem "private" eingetragenen Bereich nur mit einer Funktion aus dem "public" Bereich ansprechen?

    Und bei dem "struct" kann man dirket ohne Funktion auf die Variablen im "private" Bereich zugreifen? 😕 😕

    Ich bin jedzt voll verwirrt 😃



  • struct Bla{
        //public: //ist implizit da
        int a; //kann man drauf zugreifen, ist public
        public:
        int b; //kann man drauf zugreifen, ist public
        private:
        int c; //kann man nicht drauf zugreifen, ist private
    };
    
    class Blup{
        //private: //ist implizit da
        int a; //kann man nicht drauf zugreifen, ist private
        public:
        int b; //kann man drauf zugreifen, ist public
        private:
        int c; //kann man nicht drauf zugreifen, ist private
    };
    


  • Skeptar schrieb:

    ...

    Du hast etwas falsch verstanden...

    Wenn du kein public/private angibst, so ist bei einer class alles automatisch private, bei einer struct alles public:

    class foo {
        int a; // <-- private
    };
    
    struct foo {
        int a; // <-- public
    };
    

    Von außen kann man nur auf public-Member zugreifen, alle Member können im Regelfall (Ausnahme ist z.B. nicht-public Vererbung, aber das ist sehr selten) aber auf alle Teile zugreifen.



  • Skeptar schrieb:

    Bei einer "class" kann man die in dem "private" eingetragenen Bereich nur mit einer Funktion aus dem "public" Bereich ansprechen?

    Von ausserhalb der Klasse: ja.

    Skeptar schrieb:

    Und bei dem "struct" kann man dirket ohne Funktion auf die Variablen im "private" Bereich zugreifen?

    Nein, struct verhält sich da genau wie class.
    Du solltest die Antworten noch einmal sorgfältig lesen.



  • Okay.
    Aber ich finde es etwas unnötig 2 verschiedene "Bausteine", und im wesentlichen habe die beiden die gleiche Funktion.

    Gut das werde ich mir das noch einmal durchlesen 🙂



  • Skeptar schrieb:

    Aber ich finde es etwas unnötig 2 verschiedene "Bausteine", und im wesentlichen habe die beiden die gleiche Funktion.

    Ist historisch bedingt und hat auch etwas mit der (weitgehenden) Kompatibilität zu C zu tun. Wobei man für C-kompatible structs noch ein paar Dinge mehr berücksichtigen muss (wobei das nur relevant ist, wenn du eine C-Schnittstelle brauchst).



  • Ich find's auch ein bisschen komisch. Aber bei C++ gibt's viel was komisch ist.

    Gebraucht hätte man es auch nicht. C++ hätte das neue Keyword "class" einfach weglassen können. Viel öfter "private:" schreiben müsste man dadurch auch nicht. Die meisten C++-ler fangen sowieso mit den Public-Funktionen an, da würde man sich sogar noch ein "public:" sparen. Und bei den Basisklassen is auch meist public angesagt - private Basisklassen sind ja eher ein Sonderfall.

    Vermutlich konnte sich Stroustrup einfach nicht zurückhalten -- ohne das Keyword "class" wäre C++ ja viel weniger "objektig". Und da objektig == gut... 🤡



  • Wenns schon 2 Varianten gibt, kann man sie für semantische Unterschiede einsetzen. Ich nehme struct meist für kleine Datenbündel oder Funktoren und class für Klassen mit Kapselung.

    hustbaer schrieb:

    Aber bei C++ gibt's viel was komisch ist.

    Es gibt vor allem für alles mehrere Ansätze. Für den einzig wahren Weg gibts gewisse andere Programmiersprachen 😉

    P.S.: Tritt jemand den Verfechtern von enum struct statt enum class bei? 🤡



  • @Nexus
    Die meisten anderen Sachen, wo man in C++ mehrere Möglichkeiten hat, sind aber recht deutlich anders (z.B. FILE* vs. fstream , #define vs. static cosnt vs. enum ). Oder exakt gleich bis auf die Schreibweise ( int vs. signed int ).

    Aber struct vs. class ... pfuh. Das ist so "fast aber nicht ganz gleich". Schon etwas eigen.



  • class vs typename als Templateparameter ist genauso, wenn nicht sogar noch subtiler.



  • Öhm.
    Ich würde nicht sagen dass das das selbe ist.

    class vs. typename bei Templateparameters ist exakt das selbe von der Bedeutung her. "Subtil" ist dabei höchstens die Frage wo man statt typename auch class schreiben kann. Aber dort wo man class statt typename schreiben kann, bewirkt es exakt das selbe. Es sei denn ich hätte da irgend eine bekloppte C++11/14 Neuerung verpennt.

    Also eher das selbe wie signed int vs. int .

    BTW: char vs. signed char vs. unsigned char ist auch so ne komische C++ Sache.


Anmelden zum Antworten