Servus Ich stelle mir gerade die folgende Frage: Ich habe eine struct A. Diese beinhaltet diverse Attribute und wird in A_def.h definiert. Nun möchte ich es, so wie es in (C++) Klassen üblich ist, dass der Benutzer nur über get/set Methoden auf die Attribute zugreifen kann (auf die er auch zugreifen darf) - die Attribute also private sind außer für Funktionen aus A_def.h. Prinzipiell ist das möglich in sofern A in der A_def.c global deklariert wird. Von außen komm ich nicht ran, außer über get/set. Nun möchte ich aber mehrere Instanzen von A möglich machen, auch in anderen .c. Ist es so immer noch möglich "OOP-Like" Attribute private zu setzen und nur per get/set zugänglich zu machen? Grüße
nein ist es nicht. Aber du kannst das wissen über die Stuktur geheim halten. In dem du 2 Verschiende deklarationen der Stuktur verwendest. Einmal intern mit alles was du brauchst und nach aussem z.b. ein void*. Hier wurde genau das gemacht Beitrag "FreeRTOS frage"
Gegenfrage: warum muss es denn partout C sein? Du fragst im GCC-Forum, also kann man davon ausgehen, dass es für deine Plattform nicht nur einen C-, sondern auch einen C++-Compiler gibt. Der macht dir doch solche Dinge deutlich einfacher. Prinzipiell kannst du für jede Klasse natürlich ein public und ein private header file liefern, wobei das public header file an den Stellen der Klassenstruktur, die nicht öffentlich zugänglich sind, nur "Platzhalter" enthält (also am einfachsten ein Array mit der entsprechenden Anzahl an Bytes). Ist aber bescheuert zu pflegen und zu benutzen.
> auch einen C++-Compiler gibt. Der macht dir doch > solche Dinge deutlich einfacher. Ja, er macht sie einfacher, aber die Speicherverschwendung eines C++ Programms gegenüber eines gescheit programmierten C Programms ist gerade im µC Bereich schon manchmal enorm.
Ein gescheit programmiertes C++-Programm kann allerdings genauso effizient sein. Meine Lösung für das Eingangsproblem sieht in Anlehnung an die Python-Konventionen so aus und vertraut darauf, dass die anderen Programmierer im Projekt keine Idioten oder Pfuscher sind:
1 | typedef struct |
2 | {
|
3 | int foo; |
4 | double baz; |
5 | int _index_cache; // private, Finger weg! |
6 | } bar; |
ich schrieb: > aber die Speicherverschwendung eines C++ > Programms Bitte benenne konkret, wo C++-Programme deiner Meinung nach Speicher verschwenden. So pauschal und undifferenziert wie oben ist das nämlich Blödsinn.
Also keine wirkliche Funktionalität sondern einfach eine Konvention ala "_ = Flossen weg!". Auch eine Option. Aber das erste war so das was ich scuhte, danke.
C++ wurde mit der Prämisse "You don't pay for what you don't need" entwickelt. Und das funktioniert auch recht gut. Wichtig ist, dass Du exceptionhandling explizit wegnimmst (-fnoexceptions glaube ich). Sonst gibt's versteckten Overhead. Grundsätzlich ist aber eine Klasse im RAM genau so gross wie die Summe ihrer Members, also genau so gross wie die entsprechende Struct in C. VirtualTables werden nur angelegt, wenn Du Virtuelle Memberfunktionen hast. Und wenn Du Polymophie in C schreiben willst, brauchst Du ja auch wieder Funktionspointer. --> Was C++ Dir elegant gibt, wenn Du es brauchst, kostet also normalerweise nicht mehr, als wenn Du es in C nachbildest.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.