Objektorientiert in C arbeiten - Private in einer Struktur

OP #2168957
Lesenswert?
• ▲
▼
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
Moderator Persönliche Seite #2168976
Lesenswert?
• ▲
▼
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.
Gast #2169007
Lesenswert?
• ▲
▼
> 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.
#2169052
Lesenswert?
• ▲
▼
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;
#2170146
Lesenswert?
• ▲
▼
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.

Antwort schreiben

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.

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.