Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.04.2011, 12:21

Zugriff auf Attribut einer anderen Klasse

Hallo Leute,

ich habe zu Lernzwecken mal ein kleines Konsolenprogramm geschrieben, indem ich mich mit verschiedenen Klassen und deren Kommunikation untereinander auseinandersetzen will.
Bitte macht euch keine Gedanken, über den Sinn des Programms, es geht mir nur darum etwas zu lernen und mir fielen grad keine anderen Klassen ein.
Ich muss dazusagen, dass ich mich bisher immer mit Zeigern und Referenzen schwer getan habe und sie immer versuchte zu umgehen. Mittlerweile habe auch ich bemerkt, dass man nicht drumherum kommt.


Das CodeBlocks Projekt liegt hier:

http://darkgdk.kilu.de/bilder/Konsole_Klassen.rar


Ich habe dazu zwei Verständnisprobleme!

1. Beim Kompilieren erscheint folgende Fehlermeldung:

C:\Dokumente und Einstellungen\neuma\Eigene Dateien\C++\Konsole_Klassen\main.cpp:15: warning: deprecated conversion from string constant to 'char*'
Compiling: CComputer.cpp
Linking console executable: bin\Debug\Konsole_Klassen.exe

Was ist denn nun der Unterschied zwischen char* und string. Wahrscheinlich muss ich char* in const char* ändern, oder? Aber was ist der Sinn dahinter?

2. Zugriff auf private Attribute einer Klasseninstanz von einer Instanz einer anderen Klasse:

Ich möchte also, dass das Objekt CComputer beim Aufruf des Konstruktors die HDD-Speichergröße m_iStorage aus dem als Parameter übergebenen Objekt der Klasse

CHarddisk übernimmt. Das funktioniert jedoch nur, wenn ich das Attribut m_iStorage der Klasse CHarddisk als public deklariere. Gibt es auch eine Möglichkeit

wenn es als private deklariert ist. Muss ich eine public get- Methode der Klasse CHarddisk schreiben, die mir quasi öffentlichen Zugriff auf das Attribut int m_iStrorage gestattet, oder gibt es eine andere Möglichkeit?

Ist bissl verwirrend geschrieben und ja ich weiß, ich soll mir ein Buch kaufen und die Grundlagen lernen. Aber das mache ich ja grade...!

Gruß, NEUMee...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.04.2011, 12:47

Was ist denn nun der Unterschied zwischen char* und string. Wahrscheinlich muss ich char* in const char* ändern, oder? Aber was ist der Sinn dahinter?

Ein Stringliteral, also z.B. sowas

C-/C++-Quelltext

1
"Hello World"

liegt im Static Memory und kann nicht verändert werden (würde ja auch keinen Sinn machen) und hat daher den Typ const char[] (also ein Array aus unveränderlichen chars). Um C++ kompatibel zu C zu halten gibt es aber eine Ausnahmeregelung die es erlaubt sowas zu machen:

C-/C++-Quelltext

1
char* blub = "Hello World"

Dabei wird das const fallen gelassen, würde man nun versuchen den string auf den blub zeigt irgendwie zu verändern wäre undefiniertes Verhalten die Folge, daher warnt der Compiler hier. Besser so:

C-/C++-Quelltext

1
const char* blub = "Hello World"


Ich möchte also, dass das Objekt CComputer beim Aufruf des Konstruktors die HDD-Speichergröße m_iStorage aus dem als Parameter übergebenen Objekt der Klasse

CHarddisk übernimmt. Das funktioniert jedoch nur, wenn ich das Attribut m_iStorage der Klasse CHarddisk als public deklariere. Gibt es auch eine Möglichkeit

wenn es als private deklariert ist. Muss ich eine public get- Methode der Klasse CHarddisk schreiben, die mir quasi öffentlichen Zugriff auf das Attribut int m_iStrorage gestattet, oder gibt es eine andere Möglichkeit?

Es ist doch gerade der Sinn von private zu verhindern dass von Außen auf die entsprechenden Member zugegriffen wird (Kapselung von Implementierungsdetails und so). Es gibt die Möglichkeit eine Klasse als friend einer Anderen zu deklarieren, die hätte dann Zugriff auf die privaten Member ihrer friend Klasse, sowas sollte man aber vermeiden. Gib deiner CHarddisk doch einfach eine Methode die dir zurückliefert wieviel Speicherplatz die Disk hat. Stell dir vor du veränderst wie die CHarddisk intern funktioniert und speicherst nun nichtmehr direkt m_iStorage sondern nurmehr wieviele Sektoren die Disk hat. Wenn dein ganzer Code darauf basiert dass CHarddisk einen Member i_mStorage hat dann musst du jetzt deinen Code durchforsten und sämtliche Stellen wo der Member verwendet wurde anpassen und durch eine entsprechende Berechnung ersetzen. Wenn du einfach eine Methode int storage() gemacht hättest musst du nur diese anpassen und alles andere bleibt unverändert.

3

20.04.2011, 12:53

Klingt logisch, sehr gut erklärt. Dann werde ich das mal ändern und ne Get- Methode schreiben.

Ich danke dir, dot.

Werbeanzeige