Forum: Compiler & IDEs Objektorientiert in C arbeiten - Private in einer Struktur


von Ano N. (oorim)


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

von Peter II (Gast)


Lesenswert?

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"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Ano N. (oorim)


Lesenswert?

Danke :)

von ich (Gast)


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.

von Tom K. (ez81)


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;

von willibald (Gast)


Lesenswert?

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.

von Ano N. (oorim)


Lesenswert?

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.

von Simon H. (simi)


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.

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.