Alle Parameter innerhalb der Klasse auslesen oder überschreiben.
-
Hallo Leute,
sind solche Konstruktionen legitim oder soll dafür der Konstruktor verwendet werden?
class A { private: int a; int b; public: A (); ~A (); GetAll (class A *pobjA); SetAll (class A objA); };Danke für die Hinweise!
-
- bei den Parametern ist das "class" überflüssig. In C musste man noch structs explizit mit dem Schlüsselwort struct bezeichnen, in C++ ist sowas nicht mehr nötig.
- den Methoden fehlen die Rückgabewerte, das ist kein gültiges C++.
- Normalerweise haben Klassen gewisse Invarianten, das ist einer der Hauptgründe für Kapselung und private Attribute. Methoden zu haben, mit denen man alle Attribute beliebig verändern kann, macht die Kapselung zunichte, da kann man dann gleich structs mit public Attributen als einfache Datenbündel benutzen. Wenn du ein Objekt gleich einem anderen machen möchtest (danach sieht dein SetAll aus), gibts den operator=. Für das GetAll sehe ich keine wirkliche Verwendung.
- Wie immer gilt: Sag uns nicht was du machen willst, sondern was du damit erreichen willst. Es gibt vermutlich bessere Methoden,das zu erreichen.
-
Wie sähe das im Code aus, wenn der Inhalt eines Objekts a1 nach a2 übertragen werden sollte?
A a1, a2; a2.SetAll( a1 ); // oder a1.GetAll( &a2 );Abgesehen davon, dass das redundant ist (welche der beiden Methoden ist zu empfehlen?) ist doch mit einem einfachen
A a1, a2; a2 = a1;viel offensichtlicher was da passiert.
-
pumuckl schrieb:
- den Methoden fehlen die Rückgabewerte, das ist kein gültiges C++.
Wie würdest Du diese die Methoden in der Klasse schreiebn?

-
shuriko schrieb:
pumuckl schrieb:
- den Methoden fehlen die Rückgabewerte, das ist kein gültiges C++.
Wie würdest Du diese die Methoden in der Klasse schreiebn?

Könntest du deinen Crypto-Chip deaktivieren?

-
pumuckl schrieb:
- Wie immer gilt: Sag uns nicht was du machen willst, sondern was du damit erreichen willst. Es gibt vermutlich bessere Methoden,das zu erreichen.
Es gibt eine C-Bibliothek. Die C-Methoden dieser Bibliothek haben als Übergabewerte Strukturpointer. Diese C-Bibliothek soll in CPP-Umgebung verwendet werden. Ich wollte eigentlich so eine Art der CPP-Schnittstellen aufbauen, die dann mit Werten aus der C-Strukturen initialisiert werden. :xmas2:
-
Jollaweib schrieb:
shuriko schrieb:
pumuckl schrieb:
- den Methoden fehlen die Rückgabewerte, das ist kein gültiges C++.
Wie würdest Du diese die Methoden in der Klasse schreiebn?

Könntest du deinen Crypto-Chip deaktivieren?

Dein freundlichen Hinweis habe ich nicht verstanden. :xmas1: Vielleicht liegt es daran, dass das Deutsch nicht meine Schwestersprache
ist.
-
shuriko schrieb:
Dein freundlichen Hinweis habe ich nicht verstanden. :xmas1:
Genauso wie ich deine Frage

Die war eben sehr kryptisch.Das ist einfach so dass in C++ - genauso wie C - Funktionen bei Deklaration und Definition ein Rückgabewert vorangestellt werden muss. Gibt die Funktion nichts zurück muss man trotzdem ein "void" vorne hin schreiben.
Ein Konstruktor und Destruktor haben keinen Rückgabewert - einzige Ausnahme.
-
Jollaweib schrieb:
Das ist einfach so dass in C++ - genauso wie C - Funktionen bei Deklaration und Definition ein Rückgabewert vorangestellt werden muss. Gibt die Funktion nichts zurück muss man trotzdem ein "void" vorne hin schreiben.
Ein Konstruktor und Destruktor haben keinen Rückgabewert - einzige Ausnahme.A-aaa! Jetzt habe ich es gemerkt. Ja die Typen habe ich erstmals gelassen. Die sind bei meiner Frage nicht wichtig. Aber egal. Ich merke schon, dass ich liebe mein Problem definieren muss und dann mit Beispielen los legen.
Danke.
-
shuriko schrieb:
Es gibt eine C-Bibliothek. Die C-Methoden dieser Bibliothek haben als Übergabewerte Strukturpointer. Diese C-Bibliothek soll in CPP-Umgebung verwendet werden. Ich wollte eigentlich so eine Art der CPP-Schnittstellen aufbauen, die dann mit Werten aus der C-Strukturen initialisiert werden. :xmas2:
Ich fasse mal zusammen wie ich das jetzt verstanden hab:
- Du hast eine C-Bibliothek mit einem struct, nennen wirs mal CStruct und einigen Funktionen f1()...fn(), die jeweils einen CStruct-Pointer akzeptieren und darauf arbeiten. So wie C halt objektorientiert arbeiten kann mit den begrenzten Sprachmitteln.
- du möchtest eine C++-Klasse CppClass schreiben, die das alles kapselt, quasi als Schnittstelle zwischen deinem C++-Code und der Bibliothek.
Wie das umzusetzen ist hängt davon ab, wer die CStruct-objekte erzeugt und zerstört - wenn du da keinen direkten Zugriff hast würde ich eine Art Proxy-Klasse schreiben, die intern nur einen Pointer auf ein CStruct hält und einfach alle Methodenaufrufe an die entsprechenden Funktionsaufrufe delegiert. Der Ctor nimmt eifach einen Poitner auf das bereits erzeugte CStruct, auf dem Das Objekt danach arbeiten soll.
Andernfalls, wenn du Zugriff auf die Erzeugungsfunktion hast, kapselst du die Erzeugung des CStructs im Konstruktor deiner Klasse und die Objekte der Klasse besitzen selber jeweils die Instanz des CStructs auf der sie arbeiten. Die Methoden delegieren wie gehabt alle Zugriffe an die entsprechenden Funktionen aus der Bibliothek. Der Destruktor erledigt die Entsorgung des CStructs.
Wenn du es schaffst, alle benötigten Funktionen, die auf dem CStruct arbeiten, in Methoden zu verpacken, wars das auch schon, andernfalls brauchst du noch eine GetCStructPointer-Methode (mit Rückgabewert CStruct*).
-
pumuckl schrieb:
Wie das umzusetzen ist hängt davon ab...
Ja, das wollte ich!
Vielen Dank. 