Bräuchte hilfe beim vereinfachen einer Objektausgabe. Bzw. bei einer Objektüberprüfung...



  • Dies kann man sich doch auch irgendwie sparen oder? Irgendwie mit einer Funktion alles machen? Ich weiß nur nicht wie ich das machen soll? Würde gerne eine If-Abfage in einer Funktion machen, die nachprüft wieviel Kinder es gibt und dann die Kinder ausgibt. Ich müsste nur wissen wie man nachprüft ob ein Objekt besteht.

    void zeige(Mensch *);
    void zeige(Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    void zeige(Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *, Mensch *);
    
    void Frau::zeige(Mensch * tmp_ehemann) { ehemann = tmp_ehemann; cout << "Ehemann: " << ehemann->get_name() << endl; }
    
    void Frau::zeige(Mensch * tmp_ehemann, Mensch * tmp_kind0) {
    ehemann = tmp_ehemann; kinder[0]=tmp_kind0;
    cout << "Ehemann: " << ehemann->get_name() << endl;
    cout << "Kind 1: " << kinder[0]->get_name() << endl; }
    
    void Frau::zeige(Mensch * tmp_ehemann, Mensch * tmp_kind0, Mensch * tmp_kind1) {
    ehemann = tmp_ehemann; kinder[0]=tmp_kind0; kinder[1]=tmp_kind1;
    cout << "Ehemann: " << ehemann->get_name() << endl;
    cout << "Kind 1: " << kinder[0]->get_name() << endl;
    cout << "Kind 2: " << kinder[1]->get_name() << endl; }
    
    void Frau::zeige(Mensch * tmp_ehemann, Mensch * tmp_kind0, Mensch * tmp_kind1, Mensch * tmp_kind2) {
    if (tmp_ehemann->get_name() != 0){ ehemann = tmp_ehemann; cout << "Ehemann: " << ehemann->get_name() << endl; }
    kinder[0]=tmp_kind0; kinder[1]=tmp_kind1; kinder[2]=tmp_kind2;
    cout << "Kind 1: " << kinder[0]->get_name() << endl;
    cout << "Kind 2: " << kinder[1]->get_name() << endl;
    cout << "Kind 3: " << kinder[2]->get_name() << endl;}
    
    void Frau::zeige(Mensch * tmp_ehemann, Mensch * tmp_kind0, Mensch * tmp_kind1, Mensch * tmp_kind2, Mensch * tmp_kind3) {
    ehemann = tmp_ehemann; kinder[0]=tmp_kind0; kinder[1]=tmp_kind1; kinder[2]=tmp_kind2; kinder[3]=tmp_kind3;
    cout << "Ehemann: " << ehemann->get_name() << endl;
    cout << "Kind 1: " << kinder[0]->get_name() << endl;
    cout << "Kind 2: " << kinder[1]->get_name() << endl;
    cout << "Kind 3: " << kinder[2]->get_name() << endl;
    cout << "Kind 4: " << kinder[3]->get_name() << endl; }
    

    Vielen Dank.

    Gruss,
    Cyrill



  • eventuell mit default werten?

    void zeige(Mensch *, Mensch * = NULL, Mensch * = NULL, Mensch * = NULL,
               Mensch * = NULL, Mensch * = NULL, Mensch * = NULL, Mensch * = NULL,     
               Mensch * = NULL, Mensch * = NULL, Mensch * = NULL);
    

    Dann müsstest Du in den Funktionsrumpf einige != NULL abfragen einbauen.



  • wie wärs mit:

    class frau
    {
    public:
        frau():husband(0){}
        void setHusband(Mensch *h);
        void addChild(Mensch *c);
        void show();
    private:
        Mensch *husband;
        std::vector<Mensch*> children;
    };
    frau::show()
    {
    /*Falls husband != 0 ausgeben */
    /* Durch children iterieren und dann kinder ausgeben */
    }
    

    edit: Falls Polygamie erlaubt, dann sollte husband auch ein vector sein 😃



  • Wieso übergibst du nicht einfach einen Vektor mit Zeigern?



  • bluecode schrieb:

    ...
    edit: Falls Polygamie erlaubt, dann sollte husband auch ein vector sein 😃

    😃 👍



  • Naja ich hab's ganz einfach gemacht.

    Ich hab mir ein Integer angelegt der bei jedem geborenen Kind dem Integer 1 dazuaddiert. 🙂 Dann einfach bei der Zeigefunktion einfach eine forschleife von n bis anzahl der Kinder. Naja nicht gerade schön, aber war jetzt der schnellste Weg.

    Danke euch trotzdem.



  • So jetzt habe ich ein kleines Problem...

    kinderanzahl ist ein integervariable funktioniert auch soweit 🙂

    Diese Funktion erstellt ein Kindobjekt

    Mensch * Frau::kind (int z, char * n) 
    { 
    	kinder[z] = new Mensch (n);
    	kinderanzahl += 1;
    	return kinder[z]; 
    }
    

    Diese Funktion zeigt die Familie an.

    void Frau::zeige_familie() 
    {
    	cout << "aktueller Familienstatus : " << endl;
    	cout << "Ehemann: " << ehemann->get_name() << endl;
    	if (kinderanzahl == 0)
    	{
    		cout << "Keine Kinder\n";
    	}
    	else
    	{
    		for (int n = 0; n < kinderanzahl; n++)
    		{
    			cout << "Kind " << n + 1 << " : " << kinder[n]->get_name() << endl;
    		}
    	}
    
    	cout << "\n\n";
    
    }
    

    Mit dieser Funktion wollte ich erreichen, daß alle Objekte neu sortiert werden und das letzte Objekt was ja jetzt doppelt ist gelöscht wird. Aber sobald das delete kommt funktionert meine Funktion zeige_famielie nicht mehr. Ich weiß nicht warum, obwohl kinderanzahl auch wieder um 1 verringert wird. Sobald ich das delete weg mache funktioniert meine zeige_familie funktion einwandfrei, aber der nachteil ist, daß das Objekt noch existiert.

    Nach der Logik sollte es doch so funktionieren, oder?

    Sortiert die Objekte neu und sollte das letze Objekt löschen.

    void Frau::stirbtKind(int n)
    {
    
    	for (int b = n; b < kinderanzahl - 1; b++)
    	{
    		kinder[b] = kinder[b+1];
    	}
    	delete kinder[kinderanzahl -1];  // <---- Hier das Problem
    	kinderanzahl -= 1;
    
    }
    

    Ich hoffe mir kann jemand sagen woran das Problem liegt.

    Vielen Dank.



  • Hallo

    bluecode hat dich bereits auf std:.vector aufmerksam gemacht, das übernimmt dür dich das Verwalten des dynamischen Arrays selber.

    Bei deiner methodestirbt fällt auf, das du zuerst die nachfolgenden Objekte vorverschiebst und erst dann das eltzte löscht.
    Du must aber zuerst das Objekt an Stelle n löschen, und dann die nachvollgenden Objekte alle um eins nach vorne verschieben.

    bis bald
    akari



  • DragonShaolin schrieb:

    void Frau::stirbtKind(int n)
    {
    
    	delete kinder[n];  // Oder willst du nicht das n-te Kind löschen?
    
    	for (int b = n; b < kinderanzahl - 1; b++)
    	{
    		kinder[b] = kinder[b+1];
    	}
    	kinderanzahl -= 1;
    
    }
    

    edit: Da war wohl jemand schneller 🙂



  • ok das mit dem Vektor verstehe ich noch nicht ganz.

    Ist irgendwie unlogisch das man erst ein objekt löscht und dann neu sortiert. Ich dachte dann würde ein Objekt fehlen beim sortieren. Naja es geht jetzt.

    Danke dir.



  • Cyrill Roth schrieb:

    ok das mit dem Vektor verstehe ich noch nicht ganz.

    Mit vector ist der std::vector gemeint. Das ist eine Template Klasse welche für genau solche Zwecke geschaffen wurde 😉

    Ist irgendwie unlogisch das man erst ein objekt löscht und dann neu sortiert. Ich dachte dann würde ein Objekt fehlen beim sortieren.

    Du löscht doch das Objekt, d.h. danach ist es _weg_ und du brauchst es nicht mehr mitsortieren. Bei deinem Code hast du sowieso das falsche Objekt gelöscht 😉

    edit: Yeah 400 😃 👍



  • Na gut dann sollte ich mir mal die Templates anschauen...

    Ähm kann mir grad noch jemand sagen wie ich jetzt meine zeige_familie abändere, wenn der Ehemann stirbt? Also eine Abfrage ob das Objekt noch existiert. Nachdem ich mit delete Ehemann gearbeitet habe.

    void Frau::zeige_familie() 
    {
    	cout << "aktueller Familienstatus : " << endl;
    	//if (ehemann != NULL) cout << "Ehemann: " << ehemann->get_name() << endl;
            cout << "Ehemann: " << ehemann->get_name() << endl;
    	if (kinderanzahl == 0)
    	{
    		cout << "Keine Kinder\n";
    	}
    	else
    	{
    		for (int n = 0; n < kinderanzahl; n++)
    		{
    			cout << "Kind " << n + 1 << " : " << kinder[n]->get_name() << endl;
    		}
    	}
    
    	cout << "\n\n";
    
    }
    

    Sorry für die Fragerei...

    Danke euch...



  • abfragen ob existiert:
    if (ehemann == 0)blablabla

    löschen:
    delete ehemann;
    ehemann = 0;

    Normalerweise nimmt man 0 um anzuzeigen, dass das Objekt auf das ein Pointer zeigt noch nicht existiert bzw. bereits gelöscht wurde.



  • Jupp danke, hab ich auch gerade hinbekommen 🙂

    Super Sache 🙂

    Bald ist mein Programm fertig.

    Dann noch der feinschliff. Naja dann hätte ich ja viel zu tun 🙂



  • Kann mir jemand noch sagen wie ich eine Pausefunktion in meinem Programm einbinde? Ich hab mal irgendwas von einer Sleep() Funktion gehört. Unser Prof hat in seiner Aufgabenstellung reingeschrieben das wir eine for-schleife machen sollen, aber das ist ja dann Rechnerabhängig.



  • Hallo

    Ich hab mal irgendwas von einer Sleep() Funktion gehört

    Dann benutz doch mal die Suchfunktion...

    bis bald
    akari



  • ok mußte nur die Windows.h einbinden 🙂 und dann einfach Sleep(zeit)


Anmelden zum Antworten