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

12Cy

Frischling

  • »12Cy« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

1

28.08.2015, 02:19

Von einer Klasse auf die Daten einer anderen Klasse zugreifen

Guten Tag ihr lieben,

ich habe eine verstädnis Frage:

Wenn ich mit einer Klasse(Class A) auf eine andere Datei einer anderen Klasse(Class B) zugreifen möchte muss ich ja eine Instanz der Klasse(in ClassA eine Classb Instanz), auf die ich zugreifen möchte, in der Klasse erstellen und kann dann, mit der erstellten Instanz,auf sie zugreifen.

Wenn jetzt aber die Datei "privat" ist funktioniert das natürlich nicht außer ich schreibe mir z.B eine GetterMethode. Und da habe ich eine Frage:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <SFML/Graphics.hpp>


//ClassA CPP
void ClassA::Render()
{
  ClassB *Player;
  Player = new ClassB; //Erstelle eine Instanz von der ClassB
 
 Player->Render(this); //Überge der ClassB 

  return 0;
}

//ClassA HPP
ClassA
{
  public:
  const sf::RenderWindow &getWindow() {return *pWindow;]; //Mit der Getter möchte ich der ClassB zugriff auf die PWindow datei geben
                                       
  private:
  sf::RenderWindow  *pWindow; //Soll privat bleiben
};

classB
{   
  public:
  
  void Render(ClassA *Bild);
  
  private:
  sf::Sprite mPlayerSprite; //
  
};
  
//ClassB CPP
  
void ClassA::Render(CLassA *pClassA)
{
  *pClassA->getWindow()->draw(*mPlayerSprite);


Der Code muss nicht unbedingt Sinn machen , soll nur mein Problem verdeutlichen:

Meine Denkweise/Frage - Mein HauptZiel ist es, die MemberVariabel "pWindow" nicht privat zu machen. Deswegen habe ich mir eine getter Methode geschrieben womit ich diese DAtei bekommen kann.
Jetzt übergebe ich meiner anderen Klasse (In der ich diese Datei brauche) die Klasse ClassA damit ich auf die Getter Methode zugreifen kann. Theoretisch, wenn ich das alles Funktioniert
greife ich auf die SFML datei Draw zu und kann MplayerSprite zeichnen - Fertig.

Es Funktioniert alles sehr gut wenn ich PWindow privat mache und einfach pWindow mit übergebe. Jedoch funktioniert das nicht so wirklich mit der Getter weil er mir den Fehler anzeigt:
"Der Asudruck muss einen ZeigerTyp aufweisen(Zeile 42)"
Frage 1: Wie kann ich diese Fehler meldung umgehen/lösen?
Frage 2: gibt es "leichtere" methoden, dass zb eine andere Klassen auf Daten von anderer Klassen zugreifen kann?(vllt sogar das man keine Instanz erstellen muss)

Ich bin eigentlich eher der Typ der eher sucht bevor er was schreibt aber ich habe keine wirkliche passende Antwort auf meine Frage gefunden. Meine Erfahrung beschränkt sich auf 2 Monate (gerade das Buch von Kalista durchgelesen) c++ (auch allg. Programmieren) Erfahrung. Ich hoffe, dass die Frage nicht zu doof ist.

Ich bedanke mich schonmal im voraus :)

grüße Cy

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

28.08.2015, 04:15

Angenommen in deinem Code steht die Stell genau so wie du sie geschrieben hast:

C-/C++-Quelltext

1
const sf::RenderWindow &getWindow() {return *pWindow;];



Bist du dir im klaren, was hier die Symbole "&" und "*" bedeuten?
WIP Website: kevinheese.de

12Cy

Frischling

  • »12Cy« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

3

28.08.2015, 13:41

Theoretisch ja, praktisch kann ich mein Wissen anscheinendnoch nicht umsetzen.

Ich hatte diese Stelle erst anders in meinem Code aber wurde hingewiesen dass ich den Code so ändern soll.
Anscheinend verstehe ich diesen Teil nicht wirklich richtig- Kannst du mir vllt auf die Sprünge helfen?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

28.08.2015, 14:04

Wenn dir Englisch nichts ausmacht, kann ich diese Seite empfehlen: http://www.cplusplus.com/doc/tutorial/pointers/


Aber um es einmal zu erklären: Es gibt für * und & mehrere Bedeutungen(insgesamt 3, die 3. wären jeweils "bitweise und &" sowie der ganze normale Multiplikationsoperator*):

1) Einmal gibt es sie als Typen. * steht hierbei für einen Pointer. Als eine Variable, die eine Adresse hält, die auf ein echtes Objekt zeigt.
& steht für eine Referenz. Das ist am besten als "Alias einer Variable" zu verstehen - also die gleiche Variable mit anderem Namen. Keine Pointer-Syntax(!)

2) Dann gibt es sie noch als Operator. * ist der Dereferenzierungsoperator und gibt das Objekt zurück, auf das ein Pointer zeigt. Also zeigt ein Pointer xy auf Variable Z, so erhalte ich mit *xy direkten Zugriff auf die Variable Z (mit Pointer-Syntax).
& ist hier der Adress-Operator. Mit ihm greife ich auf die Adresse einer Variable zu. &Z gäbe mir also 001452FB oder sowas anstatt einem "echten Wert".

Da es sich hierbei

Zitat

const sf::RenderWindow &getWindow() {return *pWindow;];


Um einen Rückgabetyp handelt, gehen wir also vom ersten Fall, einer Referenz aus. Ganz richtig gibst du mit *pWindow auch das entsprechende Zielobjekt an, worauf die Referenz dann zeigt und hast entsprechend eine Referenz auf dein RenderWindow-Objekt.

Du verwendest diese allerdings wie einen Pointer

Zitat

*pClassA->getWindow()->draw(*mPlayerSprite);



Was natürlich nicht geht - weil eine Referenz kein Pointer ist.
Ich hoffe, die Erklärung hat das einigermaßen verständlich gemacht. Ich rate dir aber dennoch, den Link oder einen ähnlichen zu lesen! :)
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »KeksX« (28.08.2015, 14:13)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

28.08.2015, 14:10

private:
sf::RenderWindow *pWindow; //Soll privat bleiben

Deine Klasse hat einen Zeiger auf ein sf::RenderWindow.

const sf::RenderWindow &getWindow()

Die Funktion soll eine Referenz auf ein RenderWindow wieder geben.

{return *pWindow;];

Mal abgesehen von dem Syntax Fehler mit der Klammer "]". * dereferenziert in diesem Fall den Zeiger des Fensters. Danach erhält man das eigentliche Objekt.

Mal abgesehen davon dass ich mir grad selbst nicht sicher bin ob man eine Referenz auf einen dereferenzierten Zeiger zurück geben kann (spontan würde ich sagen ja) wirkt das alles so als wenn du nicht wüsstest was du tust. Warum gibst du in dem Fall nicht einfach den Zeiger zurück?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

28.08.2015, 15:25

Die Referenz ist solange gültig wie das Objekt existiert. Einen rohen Zeiger zurück geben ist ziemlich unschön, da man keinerlei Information hat wem das Objekt dahinter gehört und wer für die Freigabe zuständig ist. Bei der Referenz ist das eindeutig.

12Cy

Frischling

  • »12Cy« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

7

28.08.2015, 20:36

Hey ihr danke für die schnelle Antwort! So wie du Pointer und Referenzen zeigst habe ich es auch "gelesen". Ich benutze mal nicht das Wort "verstanden", denn das würde nicht stimmen. So hätte ich es auch wiedergegeben aber bei der Umsetzung scheint es noch deutlich probleme zu geben!

Viele Dank aufjedenfall für die Erkläruingen, ich konnte euch folgend. Aber wie würdet ihr denn die pWindow per Getter Methode für andere Klassen zugänglich machen?

Und unabhängig von diesem Beispiel ist das die beste Methode? per getter einfach bestimmt Membervariable zurückgeben, damit andere Klassen darauf zugreifen können?

ps: vielen dank für den Link! Ich freue mich immer sehr darüber wenn jemand gute Quellen empfehlen kann!! Gerne nehme ich solche Hilfe entgegen! Ich werde es mir, wenn ich endlich die Zeit finde, mir definitiv genau anschauen!

12Cy

Frischling

  • »12Cy« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

8

01.09.2015, 21:29

über eine Antwort würde ich mich sehr freuen :)

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

01.09.2015, 21:32

Ich sehe keinen Grund, der hier gegen einen getter spricht. Wenn es hier um die Klassenstruktur im Allgemeinen geht kann man dazu nicht viel sagen, da wir sie ja nicht sehen.

Zum Thema Getter/Setter habe ich hier nochmal einen nützlichen Link: http://stackoverflow.com/questions/94162…b=votes#tab-top
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

01.09.2015, 22:17

Einen rohen Zeiger zurück geben ist ziemlich unschön, da man keinerlei Information hat wem das Objekt dahinter gehört und wer für die Freigabe zuständig ist.
Seit C++11 ist die einzig wirklich notwendige Information aber vorhanden. Bekommt man einen Raw-Pointer, gehört er jemand anderem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige