Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Destruktor für "Unterklassen"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.05.2016, 17:10 Uhr
jasperjodler



Hi,

ich habe folgendes Problem, das ich auch nach längerem recherchieren zum Thema Destruktoren und Vektoren nicht lösen konnte. Auch die Suchfunktion hat mir leider nur spärlich zu dem Problem weitergeholfen.

Ich hoffe ihr findet den Fehler :


C++:
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>

using namespace std;

class Verzeichnis
{
public:
    
    vector<Verzeichnis*> vz;
    string name;
    
    Verzeichnis(string name)
    {
        cout << "Konstruktor : "
             << "Verzeichnis ::  Verzeichnis(std::string): "
             << setw(5) << name
             << " (" << this << ")" << endl;
        this -> name = name;
    }
    
    ~Verzeichnis()
    {
        for(unsigned int i = 0; i < vz.size(); i++)
        {
            cout << "Destruktor  : "
                 << "Verzeichnis :: ~Verzeichnis():"
                 << setw(5) << name
                 << " (" << this << ")" << endl;
            delete vz[i];
        }
    }
    
    Verzeichnis& verzeichnisHinzufuegen(string name)
    {
        Verzeichnis* v = new Verzeichnis(name);
        vz.push_back(v);
        return *v;
    }
};

int main()
{
    Verzeichnis v1("v1");
    
    Verzeichnis& v11 = v1.verzeichnisHinzufuegen("v11");
    v11.verzeichnisHinzufuegen("v111");
    
    Verzeichnis& v12 = v1.verzeichnisHinzufuegen("v12");
    v12.verzeichnisHinzufuegen("v121");
    v12.verzeichnisHinzufuegen("v122");
    v12.verzeichnisHinzufuegen("v123");
    
    cout << endl;

}



Die Ausgabe ist :


Code:
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):    v1 (0x73fca0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):   v11 (0xb714b0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v111 (0xb719b0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):   v12 (0xb71a10)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v121 (0xb71a70)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v122 (0xb71cc0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v123 (0xb71d00)

Destruktor  : Verzeichnis :: ~Verzeichnis():   v1 (0x73fca0)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v11 (0xb714b0)
Destruktor  : Verzeichnis :: ~Verzeichnis():   v1 (0x73fca0)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v12 (0xb71a10)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v12 (0xb71a10)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v12 (0xb71a10)



Ich erwarte jedoch :


Code:
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):    v1 (0x73fca0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):   v11 (0xb714b0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v111 (0xb719b0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):   v12 (0xb71a10)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v121 (0xb71a70)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v122 (0xb71cc0)
Konstruktor : Verzeichnis ::  Verzeichnis(std::string):  v123 (0xb71d00)

Destruktor  : Verzeichnis :: ~Verzeichnis():   v1 (0x73fca0)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v11 (0xb714b0)
Destruktor  : Verzeichnis :: ~Verzeichnis(): v111 (0xb719b0)
Destruktor  : Verzeichnis :: ~Verzeichnis():  v12 (0xb71a10)
Destruktor  : Verzeichnis :: ~Verzeichnis(): v121 (0xb71a70)
Destruktor  : Verzeichnis :: ~Verzeichnis(): v122 (0xb71cc0)
Destruktor  : Verzeichnis :: ~Verzeichnis(): v123 (0xb71d00)



Lg, Jasper
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.05.2016, 07:37 Uhr
Tommix



'Morgen,
da die Destruktor-Meldung im Schleifenrumpf steht, wird sie nur ausgegeben, wenn vz nicht leer ist. So klappt es:

C++:
~Verzeichnis()
    {
        cout << "Destruktor  : "
            << "Verzeichnis :: ~Verzeichnis():"
            << setw(5) << name
            << " (" << this << ")" << endl;

        for(unsigned int i = 0; i < vz.size(); i++)
        {
            delete vz[i];
        }
    }



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.05.2016, 17:43 Uhr
jasperjodler



Vielen Dank für die hilfreiche Antwort, Tommix !

Soweit klappt alles super.
Interessehalber wollte ich noch einen Kopierkonstruktor für Verzeichnisse anlegen, sodass bei dem Aufruf :


C++:
Verzeichnis v2(v1);



v1 mitsamst sämtlichen Unterverzeichnissen kopiert wird.

Da stoße ich leider auf einen Fehler. Nach etwas recherche bin ich auf die "tiefe Kopie" gestoßen, weiß aber noch nicht so recht, wie ich diese mit dem vector vz umsetzen soll.

Mir ist aber schon klar, das ich für die Verzeichnisse mit "new" neuen Speicher anlegen muss.

Soweit :


C++:
Verzeichnis(const Verzeichnis& vcopy)
    {
        for(unsigned int i = 0; i < vz.size(); i++)
        {
            Verzeichnis* v = new Verzeichnis(name);
            vz[i] = vcopy.vz[i];
            vz.push_back(v);
        }
    }



Ich hoffe mir kann jemand weiterhelfen, sonst bleibe ich ewig dumm

LG, Jasper
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.06.2016, 13:15 Uhr
Tommix



Bei einer tiefen Kopie werden die Member auch tief kopiert:

C++:
Verzeichnis(Verzeichnis const& vcopy): name(vcopy.name)
{
    for (unsigned int i = 0; i < vcopy.vz.size(); i++)
    {
        vz.push_back(new Verzeichnis(*vcopy.vz[i]));
    }
}



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.06.2016, 15:33 Uhr
jasperjodler



Vielen Dank, Tommix.

Falls es hier sowas gibt, könnte der Thread jetzt als gelöst abgehakt werden.

JJ
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: