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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren