Zeiger - Referenzen



  • Hey Leutz,
    ich habe zum Thema Zeiger eine kleine Frage..
    Ich bin gerade dabei das Thema zu verstehen und experimentiere etwas.
    Jetzt habe ich folgenden Code geschrieben:

    #include <string> 
    #include <iostream> 
    
    struct adresse 
    { 
      std::string Name; 
      std::string Ort; 
      std::string Telefonnummer; 
    }; 
    
    int main() 
    { 
      int i; 
    
      std::cout << "Wie viele Adressen moechten Sie speichern? " << 	 std::flush; 
      std::cin >> i; 
    
      adresse* Adressen = new adresse[i]; 
    
      for (int j = 0; j < i; ++j) 
      { 
        Adressen[j].Name = "Boris Schaeling"; 
        Adressen[j].Ort = "Entenhausen"; 
        Adressen[j].Telefonnummer = "1234567890";
      } 
    
    }
    

    Wie kann ich das realisieren, dass mir der Inhalt (nicht die Speicheradresse) der Variablen Adresse ausgegeben wird?!



  • earthhero1 schrieb:

    std::cout << "Wie viele Adressen moechten Sie speichern? " << 	 std::flush;
    

    Wieso flush? cout flush doch automatisch.

    earthhero1 schrieb:

    Wie kann ich das realisieren, dass mir der Inhalt (nicht die Speicheradresse) der Variablen Adresse ausgegeben wird?!

    for (int j = 0; j < i; ++j) 
      { 
        cout << Adressen[j].Name = "Boris Schaeling"; 
        cout << Adressen[j].Ort = "Entenhausen"; 
        cout << Adressen[j].Telefonnummer = "1234567890";
      }
    }
    

    Oder was meinst du?



  • Vermeide new, nimm lieber sowas wie std::vector.

    Was ist deiner Meinung nach denn der Inhalt der Variablen "Adressen"? Sie ist vom Typ "adresse" und enthält die Daten Name, Ort und Telefonnummer. Diese Daten kannst du einzeln ausgeben oder du schreibst dir einen Operator, mit dem du Adressen direkt in einen Stream schreiben kannst, hier als Ausgabe in cout:

    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct adresse
    {
        string Name;
        string Ort;
        string Telefonnummer;
    };
    
    ostream &operator<<(ostream &stream, const adresse &adr)
    {
        stream << "Name: " << adr.Name << endl << adr.Ort << endl << adr.Telefonnummer;
    
        return stream;
    }
    
    int main()
    {
        int i;
    
        cout << "Wie viele Adressen moechten Sie speichern? " << endl;
        cin >> i;
    
        vector<adresse> vec(i);
    
        for (int j = 0; j < i; ++j)
        {
            vec[j].Name = "Boris Schaeling";
            vec[j].Ort = "Entenhausen";
            vec[j].Telefonnummer = "1234567890";
        }
    
        cout << vec[0] << endl;
    }
    


  • Gugelmoser schrieb:

    earthhero1 schrieb:

    std::cout << "Wie viele Adressen moechten Sie speichern? " << 	 std::flush;
    

    Wieso flush? cout flush doch automatisch.

    earthhero1 schrieb:

    Wie kann ich das realisieren, dass mir der Inhalt (nicht die Speicheradresse) der Variablen Adresse ausgegeben wird?!

    for (int j = 0; j < i; ++j) 
      { 
        cout << Adressen[j].Name = "Boris Schaeling"; 
        cout << Adressen[j].Ort = "Entenhausen"; 
        cout << Adressen[j].Telefonnummer = "1234567890";
      }
    }
    

    Oder was meinst du?

    Tut Cout das? War mir noch nicht bewusst 🙂

    Naja er kann aber doch nichts ausgeben, was er ncoh nichtmal gespeichert hat, also würde Dein Beispiel ja nicht funktioeren. Ich meinte das eher so, dass ich nach der for-Schleife ein cout mache und dann ausgebe, was nun alles in adresse steht, sprich bei vier Adressen dann auch vier Ausgaben kommen. Also einfach die Ausgabe die eingetragen wurde



  • notarzt schrieb:

    Vermeide new, nimm lieber sowas wie std::vector.

    Was ist deiner Meinung nach denn der Inhalt der Variablen "Adressen"? Sie ist vom Typ "adresse" und enthält die Daten Name, Ort und Telefonnummer. Diese Daten kannst du einzeln ausgeben oder du schreibst dir einen Operator, mit dem du Adressen direkt in einen Stream schreiben kannst, hier als Ausgabe in cout:

    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct adresse
    {
        string Name;
        string Ort;
        string Telefonnummer;
    };
    
    ostream &operator<<(ostream &stream, const adresse &adr)
    {
        stream << "Name: " << adr.Name << endl << adr.Ort << endl << adr.Telefonnummer;
    
        return stream;
    }
    
    int main()
    {
        int i;
    
        cout << "Wie viele Adressen moechten Sie speichern? " << endl;
        cin >> i;
    
        vector<adresse> vec(i);
    
        for (int j = 0; j < i; ++j)
        {
            vec[j].Name = "Boris Schaeling";
            vec[j].Ort = "Entenhausen";
            vec[j].Telefonnummer = "1234567890";
        }
    
        cout << vec[0] << endl;
    }
    

    Das kommt dem ganzen schon recht nahe, was ist denn der Vorteil von Vector gegenüber new?
    Du gibst ja jetzt mit vec[0] nur die Adresse die im Array an Postion 0 steht aus, ich möchte aber zB wenn ich 4 Adressen eigebe alle 4 ausgeben.



  • earthhero1 schrieb:

    Naja er kann aber doch nichts ausgeben, was er ncoh nichtmal gespeichert hat.

    😃 Ja ich meinte, du musst diese for-Schleife nach der einen machen.

    earthhero1 schrieb:

    sprich bei vier Adressen dann auch vier Ausgaben kommen. Also einfach die Ausgabe die eingetragen wurde.

    😕 Wieso sollte bei der Ausgabe eines std::string eine Adresse ausgegeben werden?



  • Gugelmoser schrieb:

    earthhero1 schrieb:

    Naja er kann aber doch nichts ausgeben, was er ncoh nichtmal gespeichert hat.

    😃 Ja ich meinte, du musst diese for-Schleife nach der einen machen.

    Dann müsste die aber so aussehen 🙂 Aber das klappt 🙂

    for (int j = 0; j < i; ++j) 
      { 
        std::cout << Adressen[j].Name << std::endl; 
        std::cout << Adressen[j].Ort << std::endl; 
        std::cout << Adressen[j].Telefonnummer << std::endl;
      }
    

    earthhero1 schrieb:

    sprich bei vier Adressen dann auch vier Ausgaben kommen. Also einfach die Ausgabe die eingetragen wurde.

    😕 Wieso sollte bei der Ausgabe eines std::string eine Adresse ausgegeben werden?

    Habe mich glaube ich etwas falsch ausgedrück, wollte wissen ob sowas zB irgendwie möglich wäre, ohne ne Ahnung zu haben

    cout << *adresse << endl;
    


  • earthhero1 schrieb:

    Das kommt dem ganzen schon recht nahe, was ist denn der Vorteil von Vector gegenüber new?

    Dass du dich nicht um die Speicherverwaltung kümmern musst, da das der Vektor für dich übernimmt. So kann es nicht dazu kommen, dass du zu irgend einem new ein delete vergisst.

    earthhero1 schrieb:

    Du gibst ja jetzt mit vec[0] nur die Adresse die im Array an Postion 0 steht aus, ich möchte aber zB wenn ich 4 Adressen eigebe alle 4 ausgeben.

    Dann mach doch eine Schleife von 0 bis i - 1 und gib die Adressen aus (hier ohne Operator, da das hier wohl zu viel des Guten ist. Ich wollte mit dem Operator lediglich deine Frage beantworten, wie du deine Objekte vom Typ adresse ausgeben kannst):

    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct adresse
    {
        string Name;
        string Ort;
        string Telefonnummer;
    };
    
    int main()
    {
        int i;
    
        cout << "Wie viele Adressen moechten Sie speichern? " << endl;
        cin >> i;
    
        vector<adresse> vec(i);
    
        for (int j = 0; j < i; ++j)
        {
            vec[j].Name = "Boris Schaeling";
            vec[j].Ort = "Entenhausen";
            vec[j].Telefonnummer = "1234567890";
        }
    
        for (int j = 0; j < i; ++j)
        {
            cout << "Name: " << vec[j].Name << endl << vec[j].Ort << endl << vec[j].Telefonnummer << endl << endl;
        }
    }
    

    Allerdings solltest du in der oberen Schleife dem Benutzer die Möglichkeit bieten, die Daten der Personen selbst einzugeben, damit das Programm Sinn macht!



  • earthhero1 schrieb:

    Habe mich glaube ich etwas falsch ausgedrück, wollte wissen ob sowas zB irgendwie möglich wäre, ohne ne Ahnung zu haben

    cout << *adresse << endl;
    

    Nein, das geht nicht, weil adresse ein Typ ist und kein Objekt. So (mit einem Objekt) geht es aber:

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    struct adresse
    {
        string Name;
        string Ort;
        string Telefonnummer;
    };
    
    ostream &operator<<(ostream &stream, const adresse &adr)
    {
        stream << "Name: " << adr.Name << endl << "Ort: " << adr.Ort << endl << "Telefonnummer: " << adr.Telefonnummer;
    
        return stream;
    }
    
    int main()
    {
        adresse a, *b = &a;
    
        a.Name = "Hans Peter";
        a.Ort = "Musterort";
        a.Telefonnummer = "0900/123456";
    
        cout << *b << endl;
    }
    


  • Kaum im richtigen Forum gepostet und schon ein Haufen Antworten. 😃



  • Besten Dank Jungs 🙂 Solangsam macht es Klick 🙂



  • earthhero1 schrieb:

    Das kommt dem ganzen schon recht nahe, was ist denn der Vorteil von Vector gegenüber new?

    - Du musst dich nicht um die Speicherverwaltung kümmern.
    - rang-check in debug-builds
    - Du kannst einen vector kopieren, ein Array nicht. (Kopiersemantik)

    • vector bietet dir Methoden an, mit denen du Dinge abfragen (z.B. Größe) und den vector manipulieren kannst.
      - Es ist die schöne C++-Art.

    💡 Um genau zu sein hat new[] 0 Vorteile gegenüber vector , sondern nur Nachteile.

    earthhero1 schrieb:

    Du gibst ja jetzt mit vec[0] nur die Adresse die im Array an Postion 0 steht aus, ich möchte aber zB wenn ich 4 Adressen eigebe alle 4 ausgeben.

    🤡 Total aneinander vorbei geredet. Z.B. indem du einen vector nimmst, den operator<< überlädtst und in diesem den kompletten Inhalt des vectors ausgibst.


Anmelden zum Antworten