Forum: PC-Programmierung Zugriff auf Member-Variablen einer Klasse in "C" nicht möglich?


von ccom (Gast)


Lesenswert?

Hallo,
mein C-Programm bricht ab wenn ich eine C++ Member-Funktion aufrufe, die 
auf Member-Variablen zugreift. Gibt es dafür eine Lösung?

Vielen Dank im Voraus für Eure Antworten.

von Peter (Gast)


Lesenswert?

ja, man muss es richtig machen.

Was erwartest du von uns, im normfall geht es also wird der Fehler in 
deinen Code stecken?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine C++-Funktion muss als static deklariert werden, weil C keinen 
this-Pointer kennt.

Um nun auf Membervariablen zugreifen zu können, muss der this-Pointer 
irgendwo anders herkommen.

von ccom (Gast)


Lesenswert?

Ich möchte bitte ein Beispiel wie man in C++ geschriebene Funktionen in 
C aufruft.

z.B. Ich habe folgenden C++ Code
class M
{
  ...
  public:
    void test();
    int var_test;
};
extern "C" void M::test()
{
  var_test = 1;  // Zeile 1
  cout << "Das ist ein Test";  // Zeile 2
}

Mein C Programm führt die "Zeile 2" aus, falls Zeile 1 nicht da ist. 
Ansonsten endet das Programm mit einer Fehlermeldung von Windows.

Ich hoffe, dass ich mein Problem verständlich formuliert habe.

Danke an rufus, heißt das jetzt
  static void test() ?
Habe versucht zu kompilieren aber es funktioniert nicht.

von Peter (Gast)


Lesenswert?

sie stellt du dir denn das vor das es gehen soll?

Du hast ja gar kein Object in C. Wenn du jetzt auf ein Member zureifen 
willst von welchen Object denn?

von ccom (Gast)


Lesenswert?

Es ist so, dass ich ein C++ Programm habe und möchte die Funktionen in 
diesem Programm für mein C Programm benutzen. Diese Funktionen sind 
Member-Funktionen einer Klasse und greifen auf Membervariablen derselben 
Klasse zu.

Da ich sehr sehr wenig über C++ weiss, bitte ich um Eure Hilfe. Falls es 
gehen soll, dann freue ich mich sehr. Sonst habe ich wieder was neues 
gelernt, dass mein Vorhaben so nicht möglich ist.

von Peter (Gast)


Lesenswert?

du müsstest du Methode und dem Member variable als Static deklarieren, 
aber danach wird das C++ Programm vermutlich nicht mehr laufen, weil es 
dann mehre Objekte mit der gleichen Member Variable gibt.

Schreib es lieber als C und vergiss denn C++ teil.

von ccom (Gast)


Lesenswert?

Dann muss ich wohl den C++ teil lassen :-). Danke Peter.

von Karl H. (kbuchegg)


Lesenswert?

Oder aber du schreibst dein Programm als C++ Programm.
Legst ein entsprechendes Objekt an und rufst dessen Memberfunktionen 
auf.


C++ mit C zu kombinieren ist einfach
C mit C++ zu kombinieren hingegen nicht.

von ccom (Gast)


Lesenswert?

Danke Karl Heinz für den Tipp. Ich bleibe wohl zuerst beim C. C++ wird 
ein Vorsatz fürs nächste Jahr sein :-).

von Karl H. (kbuchegg)


Lesenswert?

ccom schrieb:
> Danke Karl Heinz für den Tipp. Ich bleibe wohl zuerst beim C. C++ wird
> ein Vorsatz fürs nächste Jahr sein :-).

Wenn du halbwegs vernünftiges C schreibst, dann wird dir ein C++ 
Compiler da nicht allzuviel auszusetzen haben.
Die Unterschiede zwischen dem C-Subset von C++ und der zur Zeit 
aktuellen C-Definition werden zwar größer, aber die meisten C Programme 
werden auch heute noch von einem C++ Compiler klaglos und korrekt 
übersetzt. Und wenn nicht, handelt es sich meistens um Dinge, die von 
vorneherein im (älteren) C Code schon dubios waren und ohnehin bereinigt 
werden sollten.

Niemand sagt, dass du in C++ mit Klassen und Membern hantieren musst. 
Man kann einen C++ Compiler auch als eine Art besseren C Compiler 
benutzen (und viele sog. C++ Programmierer tun dies auch. leider). D.h. 
du schreibst dein 'C' nach wie vor so, wie du es immer getan hast. 
Allerdings kannst du bei Bedarf auch einfach ein Objekt anlegen und von 
diesem Objekt eine Memberfunktion aufrufen :-) Und das war ja dann 
schliesslich das Ziel der Übung.

von Klaus W. (mfgkw)


Lesenswert?

Man kann sehr wohl C und C++ mischen.

Was aber zum, Aufruf von C++-Methoden aus C heraus nötig
ist, daß man im C++-Teil eine Funktion schreibt (also
außerhalb aller Klassen). Diese muß dann selbst sehen, über
welches Objekt sie welche Methode aufruft und was sie an
C-konformen Sachen liefert - mit einem Objekt als
Rückgabewert kann ja der C-Aufrufer nichts anfangen.

Wenn man diese zusätzliche Funktion dann noch als
1
extern "C"...
deklariert, steht dem Glück nichts mehr im Wege.

Gleich alles in C++ zu schreiben, ist natürlich
der direkte Weg, wie bereits erwähnt.

von Klaus (Gast)


Lesenswert?

Dies ist ein schönes Beispiel, wie Leute sich immer wieder neue Probleme 
machen, nur weil sie versuchen dem ersten Problem (C++ lernen) einfach 
aus dem Weg zu gehen.

von Klaus W. (mfgkw)


Lesenswert?

Stimmt.

Klaus Wachtler schrieb:
> Was aber zum, Aufruf von C++-Methoden aus C heraus nötig
> ist, daß man im C++-Teil eine Funktion schreibt (also
> außerhalb aller Klassen).

sorry für den Satz.

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.