www.mikrocontroller.net

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


Autor: ccom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, man muss es richtig machen.

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ccom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ccom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ccom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann muss ich wohl den C++ teil lassen :-). Danke Peter.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ccom (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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