Array aus Objekten



  • Ich seh grad, da du keinen Standard-ctor für charakter hast, funktioniert std::map wohl nicht.

    Das problem ist hier etwas ein logisches: Wenn das Objekt noch nicht existiert, brauchst du id/name/level ums zu erstellen, wenn es bereits existiert brauchst du das nicht. Ohne if (...) in irgendeiner form geht das also nicht.



  • wow danke für die schnellen antworten!

    also ich fasse mal zsm was ich beim weiter machen beachten soll:

    - destruktor fällt weg!
    - besser vector als array benutzen!
    - ausgabe ist sinnlos so und muss nochmal komplett anders gschrieben werden
    - wenn ich ein objekt anlegen will in dem weder name noch ID steht, also nichts, brauche ich den standart konstruktor:

    charakter::charakter(){}
    

    etwa so oder?



  • Einen Konstruktor der nichts tut kannst du einfach weglassen, den generiert der Compiler automatisch wenn du keinen angibst.
    Ich würde aber wenigstens ID auf 0 setzen, damit klar ist, dass dieser Character nicht existiert.



  • nwp3 schrieb:

    Einen Konstruktor der nichts tut kannst du einfach weglassen, den generiert der Compiler automatisch wenn du keinen angibst.

    Jain, der wird vom Compiler generiert, keine Frage, aber auch nur (und genau der Fall ist eignetreten) wenn es keinen anderen Konstruktor gibt (ausser dem Kopierkonstruktor)



  • hm vllt versteh ich dich nur falsch, aber das würde hier keinen sinn machen, vllt hast du auch nur nicht alles gelesen, habe den default construktor schon eingebaut und es stellt mich auch zufrieden soweit.

    versuche gerade alles auf vector um zustellen, habe da aber noch nicht soviel erfahrung, weiß nur das es ähnlich wie bei java ist



  • vllt sollte ich mit mal registrieren ^^°

    habe folgende fehler meldung wenn ich vector versuche zu benutzen:

    main.cpp: In Funktion »int main()«:
    main.cpp:32:4: Fehler: »vector« ist kein Element von »std«
    main.cpp:32:25: Fehler: expected primary-expression before »>« token
    main.cpp:32:27: Fehler: »team« wurde in diesem Gültigkeitsbereich nicht definiert
    
    charakter a("name", 1, 12);
    vector<charakter> team;
    team.push_back(a);
    

    benutze ich das pushback richtig? warum die fehler meldung = 😕


  • Mod

    #include <vector> vergessen?



  • achso... entschuldigung ich dachte das gehört zum std... darum war ich verwundert weil ich using namespace std benutze und dann trotzdem ne fehlermeldung kam das es doch nicht dazu gehört...

    wie benutzt man das push_back den richtig? gibt es dafür ein anschauliches beispiel vllt?


  • Mod

    KanakAttack schrieb:

    achso... entschuldigung ich dachte das gehört zum std...

    Tut es auch.

    wie benutzt man das push_back den richtig? gibt es dafür ein anschauliches beispiel vllt?

    Ist doch oben schon. Wenn du eine ausführliche Erklärung zu vector möchtest, dann schau in ein C++-Buch deiner Wahl. Die STL ausführlich zu erklären ist zu viel für einen einzelnen Forenbeitrag. Siehe auch hier:
    http://www.c-plusplus.net/forum/310212
    Und insbesondere hier:
    http://magazin.c-plusplus.net/artikel/Aufbau der STL - Teil 1%3A Container



  • Danke nochmal! bin viel weiter schon!

    habe jetzt den default konstruktor, den destruktor weg gelassen, und alles läuft entsprechend mit vector... habe jetzt nur ein problem mit der ausgabe:

    main.cpp:
    #include "charakter.h"
    using namespace std;

    int main(){
    string name;
    int lvl;
    vector<charakter> Team;

    while(true){
    int i;
    cout << "Indexposition wählen[0-9]: ";
    cin >> i;
    if(i>=0 && i<=9){
    cout << "Name des Charakters: ";
    cin >> name;
    cout << "Level des Charakters: ";
    cin >> lvl;

    charakter newChar(name, i+1, lvl);
    Team.push_back(newChar);
    showChar(newChar);
    }
    else
    cout << "Eingabe war nicht im Wertebereich!" << endl;
    }
    }

    charakter.cpp:

    #include "charakter.h"
    using namespace std;
    
    void showChar(charakter c){
    	cout << c.Name << endl;	
    	}
    
    //getter!
    string charakter::getName(){
    	return Name;
    }
    
    int charakter::getId(){
    	return ID;
    }
    
    int charakter::getLvl(){
    	return LVL;
    }
    //konstruktor
    charakter::charakter(string Name, int ID, int LVL){
    	this->Name = Name;
    	this->ID = ID;
    	this->LVL = LVL;
    }
    //standart-konstruktor
    charakter::charakter(){}
    

    charakter.h:

    #ifndef CHARAKTER_H
    #define CHARAKTER_H
    
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    class charakter{
    	private:
    
    	public:	
    
    		string Name;
    		int ID;
    		int LVL;
    
    		string getName();
    		int getId();
    		int getLvl();
    		void showChar(charakter c);
    		charakter(string Name, int ID, int LVL);
    		charakter();
    };
    #endif
    

    das problem liegt bei showChar, 😮

    fehlermeldung ist:

    main.cpp: In Funktion »int main()«:
    main.cpp:20:31: Fehler: Elementfunktion »void charakter::showChar(charakter)« kann nicht ohne Objekt aufgerufen werden
    make: *** [main.o] Fehler 1
    

    aber verstehe nicht was sein problem ist...



  • Du musst dich schon entscheiden, ob du eine freie Funktion showCharakter willst,
    die einen übergebenen charakter anzeigt oder eine Memberfunktion, die sich selbst anzeigt.

    Lezteres wäre

    public void showChar();
    // in main
    newChar.showChar();
    


  • ich will aber ersteres 😉 :p



  • - das using namespace std hat in Header Dateien nichts zu suchen, das solltest du entfernen
    - die Member name, ID, LVL der Klasse charakter sollten privat sein
    - um die Member zu initialisieren solltest du Initialisierungslisten benutzen
    - der Parameter name im charakter Konstruktor sollte den Typ const std::string& haben, und nicht per value übergeben werden
    - du kannst die lokale Variable newChar weglassen, indem du den Aufruf direkt in den push_back Aufruf verschiebst:

    vector<charakter> team;
    team.push_back( charakter( "Rumpel", i +1, 1 ) );
    

    - die Ausgabe hat mMn nichts in der Klasse charakter zu suchen. Ein charakter Objekt sollte nichts von Fenstern oder Konsolen wissen, daher würde ich die Implementierung als freie Funktion vorziehen


Anmelden zum Antworten