Forum: Mikrocontroller und Digitale Elektronik ist das C++ oder was anderes? int var = Objekt->funktion()->obkektVatiable;


von Hans (Gast)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Offensichtlich eine Methode, die einen Zeiger auf eine Struktur
(bzw. ein anderes Objekt) zurückgibt.

von Jemand (Gast)


Lesenswert?

Jörg W. schrieb:
> Offensichtlich eine Methode, die einen Zeiger auf eine Struktur
> (bzw. ein anderes Objekt) zurückgibt.

Müsste es in diesem Fall nicht ein "int" sein auf den gezeigt wird?
Wegen:
1
int var [...]

MFG Jemand :)

von Oliver S. (oliverso)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

Das könnte sogar reines C sein, wenn "Objekt" ein "struct" ist.

von Hans (Gast)


Lesenswert?

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?

von Lks (Gast)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

Ok verstehe.
Danke.

von Oliver S. (oliverso)


Lesenswert?

Thorsten schrieb:
> Das könnte sogar reines C sein, wenn "Objekt" ein "struct" ist.

Könnte es sein, wenn da nicht function() wäre.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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).

von Oliver S. (oliverso)


Lesenswert?

Das schon. Wie sähe denn der Funktionszeiger und das Struct für die 
Zeile
1
int var = Objekt->funktion()->obkektVatiable;

aus?

Oliver

von Cube_S (Gast)


Lesenswert?

1
struct s
2
{
3
  struct s *(*funktion)();
4
  int obkektVariable;
5
};
So vielleicht?

von Christian K. (the_kirsch)


Lesenswert?

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
}

von Oliver S. (oliverso)


Lesenswert?

Aber nur, wenn myFunction "statisch" ist, ansonsten braucht es dazu noch 
einen nachgebauten this-pointer.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Aber nur, wenn myFunction "statisch" ist

Ja, logisch, dass man "late binding" nicht damit erledigen kann.

Aber das war in obigem Ausdruck auch nicht notwendig.

von Oliver S. (oliverso)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> schon, wenn myfunction() auf Daten der eigenen Instanz zugreifen will,
> braucht es dafür den this pointer.

Ja, klar.

von Christian K. (the_kirsch)


Lesenswert?

Man kann Objekte und Klassen in C nachbauen, ob es sich lohnt ist eine 
andere Frage, ich habe das vor ein paar Jahren mal gemacht:

https://github.com/christiankarsch/RP6-I2C-Demo/blob/master/src/lib/linux/i2c/linux_i2c.c
https://github.com/christiankarsch/RP6-I2C-Demo/blob/master/src/lib/rp6/rp6.c

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hat vor Jahrzehnten schon der Athena Toolkit (X11) gemacht und dann
auch Motif.

Gruselig. :)

Ich glaube, Gtk macht das auch nach wie vor so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.