ist das C++ oder was anderes? int var = Objekt->funktion()->obkektVatiable;

Gast #4551657
Hallo Leute,
ich hab letztens eine Code gesehen bei dem ich mir nicht sicher war ob 
es C++ ist bzw. welche Version.
Mir wurde versichert, dass es C++ ist. Aber weiteres konnte man mir 
nicht erklären.
Bis jetzt ist mir sowas auch in keinem C++ Beispiel untergekommen.
1
int var = Objekt->funktion()->obkektVatiable;
Ist das wirklich C++, welche Version und wo findet man ein Beispiel zu 
sowas?
Der Operator -> kann mehrfach in einem Ausdruck angewendet werden, und 
Funktionen können pointer zurückgeben. Näheres findet sich unter den 
Stichworte "Operatoren", "Pointer" und "Funktionen" in jedem 
Grundlagenbuch zur Sprache.

Und das wird so in sehr vielen Programmen sehr häufig verwendet.

Und ja, das letzte Element in der Kette muß in dem Beispiel ein int 
(oder ein implizit in einen int castbarer Typ) sein.

Oliver
Gast
Ok ich kenne sowas.
1
int var = Objekt->funktion(); // was es machen kann ist klar
2
aber 
3
int var = Objekt->funktion()->ObVar; //hinter der Funktion noch ein Pionter auf eine Variable ist mir persönlich nicht bekannt.
Was passiert da ...funktion()->ObVar;? Wird an die Funktion eine 
Variable übergeben eine Adresse der Variable oder soll die Funktion 
diese Variable zurückgeben?
Gast
int var = Objekt->funktion()->ObVar;

könnte kurz für sowas sein:

myStruct_t* returnPointerDerFunktion = Objekt->funktion();

int var = returnPointerDerFunktion->ObVar;

wobei

myStruct_t* Objekt::funktion()
{
myStruct_t* resultStruct;
return resultStruct;
}

sein könnte.
Moderator Persönliche Seite
Oliver S. schrieb:
> Thorsten schrieb:
>> Das könnte sogar reines C sein, wenn "Objekt" ein "struct" ist.
>
> Könnte es sein, wenn da nicht function() wäre.

Ja, und?

Auch, wenn man die Dinger dort im Allgemeinen nicht „Methode“ nennt,
Funktionszeiger gab es bereits im „Ur-C“, siehe Nachlass von Dennis
Ritchie (Beschreibung der Sprache C aus dem Jahr 1975).
ANSI-C:
1
struct myObject1_STRUCT {
2
  int objectVariable;
3
}
4
typedef struct myObject1_STRUCT myObject1;
5

6
myObject1* obj1;
7

8
struct myObject2_STRUCT {
9
  myObject1* (*myFunction)();
10
}
11
typedef struct myObject2_STRUCT myObject2;
12

13
myObject1* myObject2_myFunction() {
14
  return obj1;
15
}
16

17
int main() {
18
  obj1 = (myObject1*) malloc( sizeof(myObject1) );
19

20
  myObject2* obj2 = (myObject2*) malloc( sizeof(myObject2) );
21
  obj2->myFunction = myObject2_myFunction;
22

23
  /* ... */
24

25
  int var = obj2->myFunction()->objectVariable;
26
}
Late binding ist noch eine andere Baustelle, aber schon, wenn 
myfunction() auf Daten der eigenen Instanz zugreifen will, braucht es 
dafür den this pointer.

Das obige Beispiel könnte auch C sein, es ist aber sehr viel 
wahrscheinlicher C++.

Oliver

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.