Dringend C++ Nachhilfe benötigt! - mit Bezahlung
Moderator: (M) Mod.-Team Allgemein
- NightStalker
- TalkING. Champion
- Beiträge: 891
- Registriert: Mo, 21. Okt. 02, 20:40
- Wohnort: Downloadbereich
Ja prinzipiell geht das, aber man macht das eigentlich nicht aus Designgründen. Es gibt ein paar Sachen, da muß man mit Pointern auf Objekte arbeiten (Stichwort Polymorphismus z.B., weiß nicht, ob das noch kommt).
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!
-- 好好学习,天天向上!
-
- TalkING. Superposter
- Beiträge: 297
- Registriert: Mi, 17. Feb. 10, 15:55
beides ist richtig.
Deine Klasse Nahrung kannst du vereinfacht gesagt wie int , double usw. behandeln.
Die Unterschiede zwischen den beiden Varianten sind folgendes:
hier ist essen ein Zeiger, der auf den Anfang eines Speicherbereichs "vom Typen Nahrung" auf dem Heap zeigt.
Dieser Speicherbereich muss nach der Nutzung freigegeben werden mit
man greift auf die Funktionen und Variablen von essen zu entweder so
oder so
also im Allgemeinen gesagt ... das ist eine dynamische Variable vom Typ Nahrung. Der Zeiger essen könnte später auf Wunsch des Programmierers auf einen anderen Bereich zeigen.
dies hier ist eine lokale Variable, die auf den Stack gespeichert und automatisch nach Verlassen des Gültigkeitsbereichs freigegeben wird.
also essen ist kein Zeiger, deshalb greift man auf die Funktionen und Variablen von essen mit dem Punkt zu.
Meinem Vorredner stimme ich zu.
Deine Klasse Nahrung kannst du vereinfacht gesagt wie int , double usw. behandeln.
Die Unterschiede zwischen den beiden Varianten sind folgendes:
Code: Alles auswählen
Nahrung *essen = new Nahrung();
Dieser Speicherbereich muss nach der Nutzung freigegeben werden mit
Code: Alles auswählen
delete essen;
Code: Alles auswählen
(*essen).Funktionxyz();
Code: Alles auswählen
essen->Funktionxyz();
Code: Alles auswählen
int main() {
Nahrung essen; //Objekt essen erstellt
essen. ...(); //Operation ausführen an Objekt essen
return 0;
}
also essen ist kein Zeiger, deshalb greift man auf die Funktionen und Variablen von essen mit dem Punkt zu.
Code: Alles auswählen
essen.Funktionxyz();
wenn ich also nur in dem bleibe, dann kann ich also ruhig das untere nehmen, oder?
Und wenn ich in mehreren "Ebenen", also Blöcken oder gar Schnittstellen handtiere, dann wäre eine Dynamische Variante mittels Zeiger besser?!
Gute Nacht schonmal! Und wiedermal Danke!!!!
Code: Alles auswählen
int main() Block
Und wenn ich in mehreren "Ebenen", also Blöcken oder gar Schnittstellen handtiere, dann wäre eine Dynamische Variante mittels Zeiger besser?!
Gute Nacht schonmal! Und wiedermal Danke!!!!
Can't wait the rythm...
-
- TalkING. Superposter
- Beiträge: 297
- Registriert: Mi, 17. Feb. 10, 15:55
Hier gibt's ein kleines Missverständnis ...
Die beiden Varianten können sowohl auserhalb der Blöcke (global) oder innerhalb der Blöcke (lokal) implementiert werden.
Auf globale Zeiger oder Variable kann von allen Blöcken zugegriffen werden, während die lokalen nur im eigenen Block sichtbar sind.
Ob du einen Zeiger (die erste Variante) oder eine Variable (die zweite Variante) deklarieren willst, hat nichts mit dem Gültigkeitsbereich zu tun.
Man verwendet die Zeiger in der Regel für Arrays, Polymorphie , Funktionsparameter (in bestimmten Fällen) .. usw. und verwendet Variable in den allermeisten Fällen, wo keine "dynamischen Eigenschaften (Größenänderung z. B.) " verlangt sind.
Ebenfalls gute Nacht.
Die beiden Varianten können sowohl auserhalb der Blöcke (global) oder innerhalb der Blöcke (lokal) implementiert werden.
Auf globale Zeiger oder Variable kann von allen Blöcken zugegriffen werden, während die lokalen nur im eigenen Block sichtbar sind.
Ob du einen Zeiger (die erste Variante) oder eine Variable (die zweite Variante) deklarieren willst, hat nichts mit dem Gültigkeitsbereich zu tun.
Man verwendet die Zeiger in der Regel für Arrays, Polymorphie , Funktionsparameter (in bestimmten Fällen) .. usw. und verwendet Variable in den allermeisten Fällen, wo keine "dynamischen Eigenschaften (Größenänderung z. B.) " verlangt sind.
Ebenfalls gute Nacht.
Wenn du dir eine Funktion vorstellst, die ein Objekt deiner Klasse als Parameter erwartet, wird das evtl leichter zu verstehen.
Diese Funktion arbeitet auf einem Pointer auf Nahrung (call by reference). Das Übergebene Objekt, wie Formelsammler schon gesagt hat, liegt auf dem Heap deines Programms und ist daher, wenn ein Block einen Pointer darauf bekommt, für diesen Block sichtbar, auch wenn er es nicht erstellt hat. Das Objekt wird also von dieser Funktion manipuliert und alle anderen Blöcke, die eine Referenz darauf halten, sehen die Veränderungen.
Diese Funktion arbeitet auf einem eigenen Objekt (call-by-value). Das übergebene Objekt liegt auf dem Stack und jede Manipulation geht verloren, wenn das fertige essen nicht wieder zurückgegeben wird. Z.B. so:
Welche Variante du wählst hängt stark von deiner aktuellen Anforderung ab. Brauchst du eine Klasse nur, um lokal Arbeit für dich zu verrichten, kannst du sie lokal instanziieren. Stell dir eine Klasse vor, die dir Methoden bietet, das aktuelle Datum formatiert auszugeben. Diese Klasse hat keinen Zustand, sondern ausschliesslich Methoden, die bei jedem Auruf das gleiche Ergebnis liefern. Diese Klasse brauchst du nicht auf dem Heap, weil sie nichts zum Zustand deines Programms beiträgt. Sie ist zu behandeln wie eine lokale Variable.
Ein Objekt, das aber z.B. Daten aus einer Datenbank hält ist zustandsbehaftet. Viele Methodenaufrufe oder externe Manipulationen verändern seine Daten und ist es in den wenigsten Fällen sinnvoll, diese Daten nur lokal in einer Funktion zu halten. Normalerweise willst du sie innerhalb deines Programms hin- und herreichen. Darum erstellst du das Objekt auf dem Heap und übergibst es zur Manipulation, wo es gebraucht wird.
Und Pointer haben noch einen ziemlich anschaulichen Vorteil wenn es um Manipulation durch Funktionen geht:
Diese Funktion operiert auf einem Pointer auf Nahrung. Sie verändert das essen Objekt indem sie eine Methode aufruft, die neues essen einkauft. Nebenbei speichert sie, wie oft sie einkaufen war und gibt diesen Wert zurück. Auf diese Weise erhalten aufrufenden Instanzen einen Hinweis auf die Art der Veränderun am Objekt. Da hier ein Pointer übergeben wird und keine lokale Kopie, muss nicht das Objekt selbst zurückgegeben werden sondern wird direkt in seinem eigenen Speicher manipuliert. Der Rückgabetyp ist int und gibt einen Hinweis, wie oft eingekauft werden musste.
Code: Alles auswählen
int handleEssen(Nahrung *essen)
{
...
return 0
}
Code: Alles auswählen
int handleEssen(Nahrung essen)
{
...
return 0
}
Code: Alles auswählen
Nahrung handleEssen(Nahrung essen)
{
...
return essen;
}
Ein Objekt, das aber z.B. Daten aus einer Datenbank hält ist zustandsbehaftet. Viele Methodenaufrufe oder externe Manipulationen verändern seine Daten und ist es in den wenigsten Fällen sinnvoll, diese Daten nur lokal in einer Funktion zu halten. Normalerweise willst du sie innerhalb deines Programms hin- und herreichen. Darum erstellst du das Objekt auf dem Heap und übergibst es zur Manipulation, wo es gebraucht wird.
Und Pointer haben noch einen ziemlich anschaulichen Vorteil wenn es um Manipulation durch Funktionen geht:
Code: Alles auswählen
int essenEinkaufen(Nahrung *essen)
{
int i = 0;
while (!essen->genugDa())
{
essen->kaufeNeu();
i++;
}
return i;
}