mikrocontroller.net

Forum: PC-Programmierung C++ Klassen - Zeiger und Zugriff auf Member


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Janes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Zusammen,
ich hätte eine Verständnisfrage zum Thema C++ und zwar basierend auf 
folgendes Beispiel:
#include <iostream>

using namespace std;

class Klasse
{
public:
  int *p;
  Klasse()
  {
    p=nullptr;
  }

};


int main() {
        // Beispiel 1
  Klasse * Schiff[2];
  Schiff[0] = new Klasse;
  Schiff[1] = new Klasse;

  (Schiff[0]->p) = new int;
  *(Schiff[0]->p) = 5;

  cout << *(Schiff[0]->p) << endl;

        // Beispiel 2
  Klasse * Schiff2;
  Schiff2 = new Klasse[2];  

  (Schiff2[0].p) = new int;
  *(Schiff2[0].p) = 5;

  cout << *(Schiff2[0].p) << endl;

Beispiel 1 und Beispiel 2 haben unterschiedliche Zugriffsarten und zwar 
mit "->" und mit ".". Irgendwie hat mich das Beispiel jedoch verwirrt, 
da ich nicht verstehe, wieso es sich unterscheidet.

Im Beispiel 1 deklariere ich mir ja einen Zeiger auf ein Array, dass 
Objekte beinhalten soll. Dann reserviere ich mir mit "new" den 
entsprechenden Speicher. Oder handelt es sich eher um ein Array, dass 
Zeiger auf die Objektinstanzen enthält? Das würde bedeuten, dass z.B. 
Schiff[0] eben einem zeiger entspricht, während im Beispiel 2 Schiff2[0] 
sozusagen aufgrund des "[]" dem Zugriff auf den Zeigerwert entspricht 
und somit "." statt "->" verwendet wird.

Eventuell kann das jemand verständlich ausdrücken.

Autor: Dirk K. (merciless)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Janes schrieb:
> Im Beispiel 1 deklariere ich mir ja einen Zeiger auf ein Array, dass
> Objekte beinhalten soll. Dann reserviere ich mir mit "new" den
> entsprechenden Speicher. Oder handelt es sich eher um ein Array, dass
> Zeiger auf die Objektinstanzen enthält?
Letzteres.

> während im Beispiel 2 Schiff2[0]
nicht initialisierter Speicher ist.

Ich weiß nicht, wo du den Code gefunden hast, aber
es gibt mit Sicherheit bessere Möglichkeiten, C++
zu lernen.

merciless

Autor: Janes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mir diese Beispiele selbst aufgeschrieben, um mit Zeigern zu 
experimentieren. Es ging mir eher um den Lernfaktor. Es gibt immer 
bessere Möglichkeiten ;)

Autor: C101 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar genug?
Schiff
 |         ----------
 |-------->|      --|----|
           ----------    |    ----------
           |      --|-------->|        |
          ----------     |    ~        ~
                         |    |        | 
                         |    ----------
                         |
                         |    ----------
                         |--->|        |
                              ~        ~
                              |        |
                              ----------



Schiff2
 |         ---------- 
 |-------->|        |
           ~        ~
           |        |
           ----------
           |        |
           ~        ~
           |        |
           ----------

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Janes schrieb:
> [code]
>         // Beispiel 1
>   Klasse * Schiff[2];
Schiff ist ein Array mit Zeigern auf Klasse;

>   Schiff[0] = new Klasse;
>   Schiff[1] = new Klasse;
Jetzt sind beide Zeiger initialisiert, beiden
zeigen jeweils auf ein Objekt von Klasse.

>   (Schiff[0]->p) = new int;
Schiff[0] ist ein Zeiger, also -> -Operator.


>         // Beispiel 2
>   Klasse * Schiff2;
Schiff2 ist ein Zeiger auf Klasse.

>   Schiff2 = new Klasse[2];
Schiff2 zeigt jetzt auf ein Array mit 2 Objekten
von Klasse (Schiff2 zeigt auf das erste Objekt).

>   (Schiff2[0].p) = new int;
Schiff2[0] ist ein Objekt (und/oder eine Referenz
darauf), . -Operator ist hier korrekt.

Meine obige Bemerkung mit dem nicht initialisierten
Speicher ist falsch. Ich war etwas verwirrt durch die
Operatoren.

merciless

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.