micro uc schrieb:
> hallo
> ja wie erwähnt, private und public ist mir bekannt. das protected is die
> frage. aber nebensache. mich interessiert hauptsächlich der aufbau der
> classe in den beiden files!
Tja.
Das Problem ist, das man dir jetzt einen Vortrag halten müsste, der sich
in einem C++ Buch über gut und gerne mindestens 20 Seiten erstreckt.
Das man mehrere Konstruktoren haben kann, wirst du wahrscheinlich
wissen. Einer davon ist ein Default Konstruktor, der immer dann benutzt
wird, wenn keine weiterern Parameter an den Konstruktor zu übergeben
sind.
Das ist der hier
Er kommt zb dann zum Einsatz, wenn einfach nur 1 Objekt erzeugt werden
soll
1 | int main()
|
2 | {
|
3 | CServo meinServo; // Default Konstruktor wird aufgerufen
|
Ein anderer Konstruktor ist der hier
1 | CServo( const CServo &c ); // was ist das?
|
das ist ein Copy-Konstruktor. An und für sich ein Konstruktor wie jeder
andere, also auch wie deiner hier
nur mit dem Unterschied, dass er eine Referenz auf ein Objekt vom
gleichen Typ nimmt. D.h. er wird dann eingesetzt, wenn es gilt, eine
Kopie von einem Objekt zu machen
zb hier
1 | int main()
|
2 | {
|
3 | CServo ServoA;
|
4 | CServo ServoB( ServoA );
|
ServoB ist also eine exakte Kopie vom ServoA.
OK, in dieser Form ist das natürlich Unsinn und das wird so kein Mensch
machen. Aber an anderen Stellen kommt es schon vor, dass man eine Kopie
von einem Objekt braucht. Denke zb daran, was passieren muss, wenn man
ein Objekt in einen Container einfügt. Dann gibt es 2 Möglichkeiten:
entweder man fügt eine Referenz auf das Originalobjekt in den Container
ein, oder man erzeugt eine Kopie vom Originalobjekt und fügt das in den
Container ein. Die erste Variante hat den Nachteil, dass dann das
Originalobjekt weiter bestehen muss, solange es eine Referenz davon im
Container gibt. Bei der 2.ten Varianten hab ich dieses Problem nicht.
Denn das Originalobjekt braucht keiner mehr, nachdem die Kopie gezogen
wurde. D.h. das Originalobjekt kann auch zerstört werden, das betrifft
die Kopie nicht.
Aber auch hier
1 | void foo( CServo a )
|
2 | {
|
3 | ...
|
4 | }
|
5 |
|
6 | int main()
|
7 | {
|
8 | CServo b;
|
9 |
|
10 | foo( b );
|
11 | }
|
wird eine Kopie erzeugt. innerhalb von foo ist a eine Kopie von b. Und
erzeugt wird diese Kopier durch den Aufruf des Copy Konstruktors ehe
dann der Funktionsaufruf der Funktion foo gemacht wird und der dann
diese Kopie übergeben wird.
Das hier
1 | CServo& operator=( const CServo &c ); // was ist das?
|
ist der Zuweisungsoperator. Er hat eine ähnliche Aufgabe wird allerdings
bei Zuweisungen eingesetzt
1 | int main()
|
2 | {
|
3 | CServo ServoA;
|
4 | CServo ServoB;
|
5 |
|
6 | ServoB = ServoA;
|
7 | }
|
An der Stelle der Zuweisung wird zum Zwecke der Durchführung der
Zuweisung genau diese Funktion aufgerufen. Ihre Aufgabe ist es, im
Original von B alles zu tun, was es zu tun gibt um das bisherige B
Objekt aufzulösen und die Werte vom A Objekt nach B zu übernehmen.
Soweit so gut.
Aber was hat es jetzt mit dem private auf sich?
Das ist ganz einfach.
Alle Member-Funktion, die private definiert sind, können nur von
innerhalb genau dieser Klasse benutzt werden. D.h. mit obiger
vorgeschlagener Funktion geht das gar nicht
1 | void foo( CServo a )
|
2 | {
|
3 | ...
|
4 | }
|
5 |
|
6 | int main()
|
7 | {
|
8 | CServo ServoA;
|
9 | CServo ServoB( ServoA );
|
10 |
|
11 | foo( ServoA );
|
den weder main noch foo sind Teil der Klasse. Der Copy Konstruktor ist
aber ausserhalb der Klasse nicht zugreifbar! Der Compiler muss dir das
also verbieten. Mit anderen Worten: die Klasse hat sich selbst davor
geschützt, dass irgendein anderer Code je eine Kopie eines Objektes
machen kann. Man kann Objekte anlegen, mann kann sie auch zerstören,
aber kopiern ... no, no ... das geht nicht.
Selbiges mit dem Zuweisungsoperator. Auch der ist private. Und damit
sind dann auch alle derartigen Zuweisungen
nicht compilierbar.
Effektiv hat damit die Klasse ihrem Verwender eine Schranke auferlegt,
was er tun darf und was nicht.
Warum man das in manchen Fällen haben will .... das ist eine andere
Geschichte, die allerdings noch umfangreicher zu erzählen ist und worauf
ich momentan ehrlich gesagt keine Lust habe. Denn dazu gibt es C++
Bücher.