struct mit const
-
Dann mußt Du vom struct auf eine Klasse umsteigen. Im Konstruktor die Werte für "zeigeranfang" übergeben und dann nur eine GetZeigeranfang Methode bereitstellen.
Alles andere wäre wohl ein DirtyHack: Im struct "zeigeranfang" als const definieren, die Addresse des struct herausbekommen und dann per Zeiger den Const doch zu verändern. Wenn das überhaupt die Laufzeitumgebung mitmacht...
-
Er muß deswegen aber nicht zu einer class umsteigen. Eine struct kann das auch. Wobei hier class etwas eindeutiger wäre.
-
Danke für eure Antworten.
Das Problem ist ja, dass ich den Wert für zeigeranfang erst in der Funktion bekomme. In meinem Fall sind zeigeranfang und -ende Iteratoren einer Containerliste. Der Aufwand an diese heranzukommen ist aufgrund der Struktur relativ komplex weshab ich das in der Funktion abarbeiten möchte und dann halt nur zeigeranfang und -ende als Datum des struct´s benutze. Die Funktion selber beschafft mir nur die Daten. Da ich diese Funktionalität viel benutzen muss, spare ich mir unzählige Zeilen Code.
Braunstein schrieb:
Er muß deswegen aber nicht zu einer class umsteigen. Eine struct kann das auch. Wobei hier class etwas eindeutiger wäre.
Wie mache ich das mit einem struct?
-
Hallo
genauso wie mit einer class. class und struct unterscheiden sich ausschließlich durch die Standard-Sichtbarkeit der Member.
Wie schon gesagt must du const-Member mit dem Konstruktor initialisieren. Wenn der Member nach dem Konstruktor noch geändert werden soll darf er nicht const sein.bis bald
akari
-
Okay ich hab das mit dem struct mal ausprobiert. Wusste garnicht, dass das geht. Doch ist Problem immer noch nicht vom Tisch, da ich mir zeigeranfang ja erst in der Funktion besorgen will, dann kann ich es ja nicht schon vorher dem Konstruktor übergeben.

-
Dann liegt die Lösung wohl doch darin, eine konstante Referenz zu übergeben:
void Lesefunktion(const irgendwas& data,...) { for(int i=data.zeigeranfang;i<data.zeigerende;++i) mac_was(); }Diese Funktion darf die Member von data zwar lesen, aber nicht verändern. Da das auch 'hilfszeiger' betrifft, verwendet sie eine lokale Hilfsvariable, um durch deine Daten zu iterieren.
-
Ich glaube es nicht ganz klar geworden was ich will, deshalb versuche ich es noch einmal zu verdeutlichen:
Also es gibt die Definition des structs:
struct MyStruct { int zeigeranfang; int zeigerende; int hilfzeiger; };dann die Funktion:
void eineFunktion( MyStruct& ms, /* u.v.m.... */ ) { //z.B. eine Funktion die mir den zeigeranfang besorgt ms.zeigeranfang = besorgmirzeigeranfang( /* u.v.m.... */ ) ms.zeigerende = //....... //....... };Zum schluss eine Funktion, in der das alles genutzt wird: z.B.
int main() { MyStruct MS; eineFunktion( MS, /* u.v.m.... */ ); for(MS.zeigeranfang; MS.zeigeranfang != MS.zeigerende; ++MS.zeigeranfang) { //...... Code ... /* NUN SOLL ABER GENAU DAS NICHT MÖGLICH SEIN, DASS MAN MS.zeigeranfang ERHÖHEN KANN UM DIE INFORMATION DARÜBER NICHT ZU VERLIEREN, WO DER ANFANG DER LISTE IST. UM DAS ZU VERMEINDEN WÄRE ES GUT, WENN MS.Zeigeranfang const WÄRE UND DAMIT DER KOMPILER FESTSTELLT, DASS MIST GEBAUT WURDE. NUR KANN ICH JA LEIDER zeigeranfang IN DEM struct NICHT ALS const DEKLARIEREN, DA ICH MIR DIE INFOS ERST IN DER LISTE HOLE*/ }
-
Hallo
Mach die eigentlichen Membervariablen in MyStruct private und füge dafür Getter und Setter hinzu. Der Aufruf eines Setters anstatt eines Getters ist schon ein grober Fehler.
Allerdings wird mir nicht klar warum du nicht gleich ein std::vector nimmst, da ist besser als dein handgemachter schlechte Nachbau.
bis bald
akari
-
Stonecold_Mario schrieb:
Ich glaube es nicht ganz klar geworden was ich will, deshalb versuche ich es noch einmal zu verdeutlichen:
Also es gibt die Definition des structs:
struct MyStruct { int zeigeranfang; int zeigerende; int hilfzeiger; };dann die Funktion:
void eineFunktion( MyStruct& ms, /* u.v.m.... */ ) { //z.B. eine Funktion die mir den zeigeranfang besorgt ms.zeigeranfang = besorgmirzeigeranfang( /* u.v.m.... */ ) ms.zeigerende = //....... //....... };Zum schluss eine Funktion, in der das alles genutzt wird: z.B.
int main() { MyStruct MS; eineFunktion( MS, /* u.v.m.... */ ); for(MS.zeigeranfang; MS.zeigeranfang != MS.zeigerende; ++MS.zeigeranfang) { //...... Code ... /* NUN SOLL ABER GENAU DAS NICHT MÖGLICH SEIN, DASS MAN MS.zeigeranfang ERHÖHEN KANN UM DIE INFORMATION DARÜBER NICHT ZU VERLIEREN, WO DER ANFANG DER LISTE IST. UM DAS ZU VERMEINDEN WÄRE ES GUT, WENN MS.Zeigeranfang const WÄRE UND DAMIT DER KOMPILER FESTSTELLT, DASS MIST GEBAUT WURDE. NUR KANN ICH JA LEIDER zeigeranfang IN DEM struct NICHT ALS const DEKLARIEREN, DA ICH MIR DIE INFOS ERST IN DER LISTE HOLE*/ }OMFG!
dann mach doch eine Frienddeklaration von "eineFunktion"dann kannst du in eineFunktion auf die Private-Member auch "settend" zugreifen, und die anderen User können die Get-Methoden verwenden, um ihre Daten zu bekommen ...
struct MyStruct { friend void eineFunktion(MyStruct &ms, /* u. v. m.*/); int Getzeigeranfang(); int Getzeigerende(); int Gethilfzeiger(); private: int zeigeranfang; int zeigerende; int hilfzeiger; };
-
akari schrieb:
Hallo
Mach die eigentlichen Membervariablen in MyStruct private und füge dafür Getter und Setter hinzu. Der Aufruf eines Setters anstatt eines Getters ist schon ein grober Fehler.
Allerdings wird mir nicht klar warum du nicht gleich ein std::vector nimmst, da ist besser als dein handgemachter schlechte Nachbau.
bis bald
akariLetztendlich ist mein Struct dann eine Klasse!?
Mein schlecher Nachbau ist ja nur ein Beispiel. Es ist letzlich nichts anderes als ein Vector mit Containern was ich wirklich habe. Die Struktur die hier vorliegt ist nur so komplex, dass ich mir um an die Iteratoren ran zu kommen eine Komponente hole diese mit einem dynamic_cast als Liste caste u.s.w.. Diesen ganzen Vorgang wollte ich in einer Funktion verstecken, da ich ihn sehr oft brauche und das u.a. den Code unleserlich macht.
Wenn ich mir jetzt ne Klasse mit getter und setter functions mache, ist das meiner Meinung nach schon wieder etwas overfeatured, so dass ich letztlich so lassen kann wie es vorher war. Ich werd mir was überlegen. Evtl. nehm ich ne Klasse.Danke und Gruß
-
akari schrieb:
... class und struct unterscheiden sich ausschließlich durch die Standard-Sichtbarkeit der Member...
Nochmal, class und struct sind identisch bis auf die oben erwähnte Einschränkung.
-
Braunstein schrieb:
akari schrieb:
... class und struct unterscheiden sich ausschließlich durch die Standard-Sichtbarkeit der Member...
Nochmal, class und struct sind identisch bis auf die oben erwähnte Einschränkung.
Okay, aber wenn ich dann jetzt nochmal folgendes Beispiel aufgreife:
(siehe oben)struct MyStruct { friend void eineFunktion(MyStruct &ms, /* u. v. m.*/); int Getzeigeranfang(); int Getzeigerende(); int Gethilfzeiger(); private: int zeigeranfang; int zeigerende; int hilfzeiger; };habe ich doch eigentlich ne Klasse, da es ja private Meberber gibt!? Oder?
Deshalb: "Letztendlich ist mein Struct dann eine Klasse!?"
-
Ich würde ja sagen:
eine Klasse ist etwas, wo class davor steht.
ein Struct ist etwas, wo struct davor steht.Wo liegt das Problem?
-
Stonecold_Mario schrieb:
habe ich doch eigentlich ne Klasse, da es ja private Meberber gibt!? Oder?
Deshalb: "Letztendlich ist mein Struct dann eine Klasse!?"
Das hat nichts mit
privatezu tun. Meditier einfach nochmal darüber was akari und Braunstein gesagt haben.
-
Hallo
Du must eben trennen zwischen dem Prinzip Klasse, bestimmt durch die Möglichkeiten des OOP. Und der Umsetzung in C++. Die Umsetzung wird repräsentiert durch das Schlüsselwort class... und eben auch durch das Schlüsselwort struct. Dem Compiler ist es egal wie es heißt (bis auf genannte Ausnahme).
Deshalb kann man auf deine Fragehabe ich doch eigentlich ne Klasse, da es ja private Meberber gibt!? Oder?
mit ja antworten. Man kann übrigens auch Klassenorientiert programmieren ohne auch nur einmal die Schlüsselwörter class oder struct zu verwenden.
bis bald
akari
-
Stonecold_Mario schrieb:
...
habe ich doch eigentlich ne Klasse, ...Ja - denn Du hast IMMER eine Klasse, wenn Du ein struct hast.
Stonecold_Mario schrieb:
...
...da es ja private Meberber gibt!?Nein - auch sonst.
Merk Dir einfach:
- struct = Klasse mit Default=public
- class = Klasse mit Default=privateIch glaube, Du stellst Dir da selbst ein Bein (vllt. weil Du ein wenig ungeübt bist im C++-Denken), wenn Du versuchst, einen philosphischen Unterschied zwischen struct und class zu definieren.
Gruß,
Simon2.
-
class und struct sind beides nur Keywords mit denen du die Definition bzw. Deklaration eines UDT "einleitest".
Es ist sogar erlaubt "struct" in einer fwd. declaration zu verwenden und das Ding dann später mit "class" zu definieren.
Wenn es dich so verwirrt vergiss doch einfach dass es 2 verschiedene Keywords gibt, und verwende immer class.