zeiger / klassen



  • hallo,

    dies ist mein erstes posting hier...
    die suchfunktion habe ich auch benutzt aber so richtig weiss ich nicht
    wonach ich suchen soll...

    mein problem ist folgendes...

    ich habe z.b. eine klasse adresse.

    class adresse
    {
       char *nachname;
       char *vorname;
    
    public:
    
    int setzeAdresse(char *a, char *b)
    {
          if (nachname = (char *) malloc(strlen(a)+1))
          {
              strcpy(nachname, a);
              .....
          }
    }
    
    ~adresse()
    {
         if (nachname)
            free(nachname);
          ......
    }
    };
    
    desweiteren habe ich
    
    char **pp_adresse = NULL;
    char **backup_pp_adresse;
    int i = 0;
    int counter = 0;
    
    int eingabe()
    {
        ...... 
      backup_pp_adresse = pp_adresse;
      pp_adresse = (adresse **) realloc(pp_adresse, (counter+1)*sizeof(adresse *));
      if (pp_adresse)
      {
         pp_adresse[counter] = new adresse;
         if (pp_adresse[counter])
         {
             pp_adresse[counter]->setzeAdresse(....)
             counter++;
         }
         ......   
       }
       .....
    }
    
    void loeschen()
    {
        int j = 0;
    
        if (pp_adresse)
        {
            for (j=0;j<counter;j++)
            {
                delete pp_adresse[j];   // hier crasht es !!!
            }
            free(pp_adresse);
         }
    }
    

    sobald die funktion löschen aufgerufen wird spring mich der
    vc++ 6 mit einer assertmeldung an.

    sowit ich weiss muss man alles was mit new allokiert wurde auch mit
    delete wieder freigeben...

    das programm wird ohne fehler und warnungen kompiliert...

    es muss also ein denkfehler meinerseits vorliegen...
    weiss von euch jemand eine lösung ??

    mfg
    diet

    <hume>Bitte Code-Tags verwenden!</hume>



  • pp_adresse = (adresse **) realloc(pp_adresse, (counter+1)*sizeof(adresse *)); 
    if (pp_adresse) 
    { 
    pp_adresse[counter] = new adresse;
    

    1. dynamische arrays mit pointern macht man anders
    2. wieso machste zuerst einen realloc, und gehst danach mit new drüber? das isn dickes speicherleck
    3. mit new normale variablen erstellen mit delete freigeben, mit new[] arrays erstellen, und dann mit delete[] freigeben.
    du machst im moment das: new..delete[]



  • Was spricht gegen std::vector und std::string?



  • erst krabbeln, dann laufen 😉



  • diet, schau dir insbesondere mal die ersten beiden Beispiele aus der FAQ an:

    http://www.c-plusplus.net/forum/viewtopic.php?t=39489

    Erst wenn du die Verstanden hast, lies dir drei und vier durch. Auf die Weise
    lernst du mehr 😉



  • hallo,

    meine gedanken waren ja folgende...

    char buffer[128];
    char **namen = NULL;
    char **backup_namen;
    int counter = 0;
    int i = 0;
    ....
    
    cin.getline(buffer, 40);
    backup_namen = namen
    namen = (char **)realloc(namen, (counter+1)*sizeof(char *));
    ....
    namen[counter] = (char *) malloc(strlen(buffer]+1));
    strcpy(namen[counter], buffer);
    counter++;
    ....
    
    for (j=0;j<counter;j++)
    {
       free(namen[j]);
    }
    free(namen);
    

    dieses programm hat funktioniert , der kompiler hat sich auch nicht beschwert..
    also dachte ich mir mit objekten könnte es auch so klappen...
    aber scheinbar...

    templates... soweit bin ich noch nicht...
    will ja erstmal begreifen was ich hier mache (und offensichtlich nicht verstehe)

    ich werde mir die FAQ aber anschauen... vielleicht werde ich ja dadurch schlauer

    mfg
    diet



  • otze schrieb:

    erst krabbeln, dann laufen 😉

    Erst string verwenden, dann char*

    Sonst macht das ganze doch keinen Sinn.



  • erst char* dann weis man wenigstens, was string macht...



  • otze schrieb:

    erst char* dann weis man wenigstens, was string macht...

    und erst assembler und dann c und dann c++?
    ne.

    wozu ist es für einen anfänger wichtig, wie string funktioniert? es ist wichtig, dass ein anfänger lernt zu programmieren und nicht wie man auf händen und füssen kriecht 😉

    natürlich muss man sich auch irgendwann mit der funktionsweise von char* befassen, aber doch nicht am anfang. denn da hat man genug probleme. Zeiger sind ja ein extrem komplexes thema - das würde ich so lange meiden wie möglich. und char* ist nun wirklich etwas verdammt ekliges.

    das ist genauso komisch, wie wenn tutorials als erstes mit bitoperationen anfangen. da kann der leser kaum eine funktion schreiben, ihm wird aber schon shiften, anden, oren, xoren usw. beigebracht.

    sowas finde ich unnötig.

    man soll langsam anfangen. am anfang hat man ja noch probleme was funktionen sind, der unterschied call by reference/by value etc. Lauter Probleme. Wozu da noch die Fehlerquelle Nr. 1 von Anfängern rein bringen? Damit sie demotiviert werden und es aufgeben?



  • hallo,

    so genau weiss ich ja immer noch nicht warum es nicht funktioniert...

    könnte mir jemand meinen denkfehler mal erklären ?

    mfg
    diet


Anmelden zum Antworten