String einlesen lassen (Klassen)
-
Hi, ich möchte einen string "namen" einlesen lassen. Jedoch funktioniert das sonst verwendete getline( cin, a.setName); leider nicht. Kann es sein, dass man bei Klassen den string anders einlsen muss?
und ja ich weiß konstruktoren sind besser, aber ich übe zurzeit die getter und setter methodenclass Raumschiff{
private:
string name;
int pos_x=0;
int pos_y=0;public:
string getName() {
return name;
}
void setName(string n) {
name = n;
}int getPos_x() { return pos_x; } void setPos_x(int x) { pos_x = x; } int getPos_y() { return pos_y; } void setPos_y(int y) { pos_y = y; } int neue_pos(int move) { pos_x = pos_x + 10; pos_y = pos_y + 10; }
};
int main()
{
Raumschiff a;
cout << "Bitte geben Sie dem Raumschiff einen Namen: " << endl;
getline(cin, a.setName);cout << "Sie haben den Raumschiff folgenden Namen gegeben: " << endl; cout << a.getName(); system("PAUSE"); return 0;
}
-
wie wäre es mit cin >> a.getName(); ?
-
@Wade1234 funktioniert leider auch nicht. Ist ja zudem ein string also müsste es theoretisch auch mit getline gemacht werden
Grund unten:
Binärer Operator >> Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ "str:: string" akzeptiert
-
@Wade1234 sagte in String einlesen lassen (Klassen):
wie wäre es mit cin >> a.getName(); ?
Schlecht? Der ist ja gleich wieder weg.
-
@mmm_1482_ dann erstell dir doch eine methode, die
cin >> name
aufruft.
-
@mmm_1482_
Wenn du diese unsäglichen getter/setter verwenden willst, musst du den Namen in einen String einlesen und dann damit set aufrufen.
-
@Wade1234
habe ja bereits die getter und setter dazu gemacht. und wenn ich selbst einen Namen initialisiere, dann funktioniert es auch. Aber ich möchte, dass der Benutzer den Namen eingibt
-
-
@Wade1234 perfekt das hat funktioniert! Vielen dank
-
@mmm_1482_ im hinblick auf oop ist das natürlich vorbildlich, geschwindigkeitsmäßig wird da aber wieder kopiert und alles ist langsam.
-
@Wade1234 ja ich weiß.. nur müssen wir das für die Prüfung leider drauf haben
-
@mmm_1482_ achso. ja also generell kannst du dir merken, dass du für jede popelige variable eine solche set-methode erstellen darfst, die dann den übergebenen wert kopiert. dadurch ist das dann alles schön abgesichert, aber gängige computerspiele laufen dann entsprechend langsam.
-
@Wade1234 sagte in String einlesen lassen (Klassen):
@mmm_1482_ achso. ja also generell kannst du dir merken, dass du für jede popelige variable eine solche set-methode erstellen darfst, die dann den übergebenen wert kopiert. dadurch ist das dann alles schön abgesichert, aber gängige computerspiele laufen dann entsprechend langsam.
Ordentlich implementiert sind Getter/Setter unter Optimierungen nicht lansamer als direkter Zugriff auf die Variablen (
const&
-Getter und Setter, die unnötige Kopien vermeiden, z.B. by value-Parameter + Move).Was aber definitiv stimmt, ist dass sie ein ziemlicher Schlepp zu implementieren sind und den Code mit jeder Menge Boilerplate aufblähen. Daher bin ich auch kein Fan davon.
Sie haben aber nicht von der Hand zu weisende Vorteile: Ein einziges Interface um von außen auf Instanzattribute zuzugreifen, an das man bei Bedarf noch ein Stück zusätzlichen Code hängen kann.
Manchmal wünsche ich mir sowas wie C#-Properties auch für C++. Es wäre schon manchmal nützlich Member-Zugriffe mit zusätzlichem Code versehen zu können, ohne das Interface so verändern zu müssen, dass man sämtlichen Code anpassen muss. Andererseits kann man aber auch Klassen so bauen, dass den Anwender nicht zu interessieren braucht, was für Attribute die alle haben - nur was für eine Funktionalität sie exponieren.
-
@Wade1234 sagte in String einlesen lassen (Klassen):
geschwindigkeitsmäßig wird da aber wieder kopiert und alles ist langsam.
So ein Quatsch.
-
@Swordfish sagte in String einlesen lassen (Klassen):
@Wade1234 sagte in String einlesen lassen (Klassen):
geschwindigkeitsmäßig wird da aber wieder kopiert und alles ist langsam.
So ein Quatsch.
du wiederholst dich......
-
Wenn du Blödsinn schreibst, dass "gängige Computerspiele [...] dann entsprechend langsam [laufen]", dann spendiere ich @Swordfish sogar noch die Soße zum Quatsch
Tipp: schau dir auf godbolt an, was wirklich passiert. Und wenn es Unterschiede gibt, beweise mit einem Profiler, dass das wirklich die Ursache ist.
-
ja da wird dann operator= aufgerufen, welches dann den inhalt kopiert.
-
@Wade1234 tu was @wob gesagt hat.
-
@Swordfish habe ich. operator= wird aufgerufen und laut http://www.cplusplus.com/reference/string/string/operator=/ wird der inhalt kopiert.
-
@Wade1234 sagte in String einlesen lassen (Klassen):
@Swordfish habe ich. operator= wird aufgerufen und laut http://www.cplusplus.com/reference/string/string/operator=/ wird der inhalt kopiert.
Ich verstehe nicht, was das mit dem Thema "getter und setter", die deiner Meinung nach alles langsam machen, zu tun haben sollte.