Dynamische Klassen ?

Kato1998

Grünschnabel
Hallo :) ,

Ich stelle mir schon seit Längerem eine Frage. Ich möchte z. B. Ein Telefonbuch in C++ Pogrammmieren dafür mochte ich eine Klasse nutzen.

z.B

C++:
class Telefonbuch {
private:
public:
    //Variablen
   
std::String Name;
int Telefon;
int Geburtsdatum;

};


Dem Nutzer soll es möglich sein selber Namen, Telefon Nummern und Geburtsdaten hinzuzufügen.


Meine Frage ist jetzt, wie kann ich so etwas mit einer Klasse machen??


Theoretisch könnte man ja int vectroen und string vectoren benutzen, aber ich glaube, es gibt noch eine bessere Möglichkeit .

Ich freue mich auf Antworten :)
 

cwriter

Erfahrenes Mitglied
Theoretisch könnte man ja int vectroen und string vectoren benutzen, aber ich glaube, es gibt noch eine bessere Möglichkeit
Was meinst du? Getter und Setter? Die Telefonnummer sollte wohl ein String sein (int ist für Zahlen, nicht Zahlenfolgen). Geburtsdatum geht auch einfacher als String.
Aber was meinst du, was besser wäre? Eine Klasse gruppiert die logische Klasse und die Objektinstanz, die die Werte speichert. Was willst du da besseres? Eine Datenbank?

Gruss
cwriter
 

Kato1998

Grünschnabel
Was meinst du? Getter und Setter? Die Telefonnummer sollte wohl ein String sein (int ist für Zahlen, nicht Zahlenfolgen). Geburtsdatum geht auch einfacher als String.


okay gut zu wissen

Aber was meinst du, was besser wäre? Eine Klasse gruppiert die logische Klasse und die Objektinstanz, die die Werte speichert. Was willst du da besseres? Eine Datenbank?

Naja, meine Frage wenn ich das Programm Starte und z.b 5 Personen einspeichern mochte , wie kann ich das machen ? Natuerlich muss ich die Eingaben usw. auslesen , aber wie kann ich mehrere Eintraege in der Klasse speichern ?
 

Jennesta

Erfahrenes Mitglied
Naja, meine Frage wenn ich das Programm Starte und z.b 5 Personen einspeichern mochte , wie kann ich das machen ? Natuerlich muss ich die Eingaben usw. auslesen , aber wie kann ich mehrere Eintraege in der Klasse speichern ?

Du solltest dafür mehrere Klassen in Betracht ziehen. Eine Klasse Telefonbuch, die wiederum eine gewisse Anzahl von Personen speichert, die jeweils eigene Daten haben. Damit hast du auch die Daten logisch besser und zusammengehörig gekapselt.
 

Kato1998

Grünschnabel
Und wie kann ich sowas abspeichern ? Wie kann ich mehrere Personen abspeichern ? Eine Klasse in ein Array / Vector verpacken ?

Ich meine ich koennte das bei einem struct so machen (Obwohl ich denke das es da auch bessere Moeglichkeiten gibt.

C++:
struct data {
    int id;
    std::string Name;
    std::string Telefon;
    std::string mail;
};
data benutzer[100]; // Es koennen bis zu x Benutzer gespeichert werden.
 

cwriter

Erfahrenes Mitglied
Eine Klasse Telefonbuch, die wiederum eine gewisse Anzahl von Personen speichert
Als Ergänzung: Dafür kannst du einen Vektor verwenden:
C++:
class Eintrag //Wie dein Telefonbuch oben.
{

}
class TelefonBuch
{
public:
//...

std::vector<Eintrag> m_entries;

}

Ich meine ich koennte das bei einem struct so machen
Ein struct ist im Prinzip eine Billig-Klasse (oder eine Klasse ist ein Struct auf Steroiden).

Gruss
cwriter
 

Kato1998

Grünschnabel
Danke fuer die Antworten ,ich bin gerade etwas verwirrt. Also brauche ich 2 Klassen in der einen Kommen die Variablen fuer mein Telefonbuch , z.B Name usw.

und in die 2. Klasse kommt der Vector fuer Klasse 1 ?


C++:
class Eintrag 
{
public:
    //Variablen
  
std::String Name;
int Telefon;
int Geburtsdatum;
};


class TelefonBuch
{
public:

std::vector<Eintrag> m_entries;

};


Kann ich nicht den Vector fuer die 1. Klasse auch ohne die 2. Schreiben also :
C++:
class Telefonbuch 
{
public:
    //Variablen
 
std::String Name;
int Telefon;
int Geburtsdatum;
};

std::vector<Telefonbuch> m_entries;


Wo ist der vorteil wenn ich eine 2. Klasse habe ?
 

cwriter

Erfahrenes Mitglied
Wo ist der vorteil wenn ich eine 2. Klasse habe ?
Mit einer nackten Klasse wie oben: Keiner.

Aber du benutzt Klassen ja vor allem, um Funktionen an Daten zu binden (bzw. umgekehrt). In diesem Fall könntest so etwas haben wollen:
C++:
class Eintrag
{
public:
    //Variablen

std::string Name;
std::string Telefon;
std::string Geburtsdatum;
};


class TelefonBuch
{
public:
    std::string getPhoneNumber(const std::string& name) const {
        //Code kommt hier hin, dürfte so etwas sein wie
        auto it = std::find_if(m_entries.begin(), m_entries.end(), [&](const Eintrag& e) { e.Name == name; });
        if(it != m_entries.end()) return (*it).Telefon;
        else return "Not found";
    }
std::vector<Eintrag> m_entries;

};

Wenn du den Vektor ausserhalb einer Klasse hast, musst du entweder eine Funktion schreiben, die einen Vektor nimmt (etwa:)
C++:
    std::string getPhoneNumber(const std::vector<Eintrag>& vec, const std::string& name) const {
        //Code kommt hier hin, dürfte so etwas sein wie
        auto it = std::find_if(vec.begin(), vec.end(), [&](const Eintrag& e) { e.Name == name; });
        if(it != vec.end()) return (*it).Telefon;
        else return "Not found";
    }
Aber das kann schnell kompliziert werden. Daher nimmt man lieber das OO-Konzept und organisiert Funktionen mit den zugehörigen Daten.

Gruss
cwriter
 

Jennesta

Erfahrenes Mitglied
Wo ist der vorteil wenn ich eine 2. Klasse habe ?

Der Vorteil ist bei diesem Beispiel hier in der Tat nicht ganz ersichtlich.
Aber wenn du alle Einträge in einen Vektor speicherst, kann jeder der den Vektor benutzt auch alles mit dem Vektor machen. Was ist nun aber, wenn du nicht möchtest, dass jemand Einträge aus dem Telefonbuch löscht, editiert oder sortiert. Man soll nur hinzufügen können.
In diesem Fall würdest du den Vektor als private Member definieren. So kann niemand außer der Klasse selbst etwas mit dem Vektor machen und würdest dann lediglich eine Methode zum hinzufügen spendieren.