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

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

1

01.01.2014, 16:09

C++ Friendklassen korrekt anwenden mittels Kopierkonstruktor

Hallo liebe Community,
habe folgendes Problem:
Für mein SnakeGame soll eine Fruchtklasse als Friend einer GameField Klasse angewendet werden.
= Frucht(&TestFeld1); oder Frucht(TestFeld1); oder Frucht(*TestFeld1);


Innerhalb der Fruchtklasse soll durch diese einmalige Übergabe auf die Werte der anderen Klasse zugegriffen werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class GameField
{

friend class Fruit;

public:
GameField();


protected:
SDL_Rect GameFieldRect;
int length;
int fieldsize;


};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "gamefield.h"

class Fruit
{

public:
Fruit();
Fruit(GameField &obj){UebergebenesObjekt=obj;}   // Kritischer Punkt an dem das Problem liegt, wie ist es korrekt

int GetGameFieldLength(){return UebergebenesObjekt.GameFieldRect[GetLength()*FYPos + FXPos].x;}
int GetLength(){return UebergebenesObjekt.GameFieldRect[XPos].w;}

protected:
GameField &UebergebenesObjekt; // (oder *Referenz, oder Referenz)
int flength, int FYPos, int FXPos;

};



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
main.cpp

#include "fruit.h"

//...

GameField TestGameField1;
Fruit Apfel(&TestGameField1);

Apfel.Funktion1();
Apfel.Funktion2();


//...


Wie erreiche ich eine korrekte Übergabe.
Danke im voraus :)
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Daedra22« (01.01.2014, 16:41)


2

01.01.2014, 16:33

Du übergibst eine Snake-Referenz, willst diese aber einer GameField-Referenz zuweisen. Dies funktioniert nur, wenn Snake von GameField abgeleitet ist (und ist auch dann unsinnig). Referenzen müssen initialisiert werden, Stichwort Initialization List.

Wozu muss Fruit ein friend von GameField sein?

EDIT: Wieso hat GameField einen Fruit-Konstruktor?
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

3

01.01.2014, 16:46

Sry für die 2 Fehler ist noch der Restalkohol von gestern :)

Ich möchte es gerade nicht ableiten lassen da GameField noch von einer anderen Klasse erbt und dadurch ... (entstehen weitere Folgen, die ich für das Problem nicht beschreiben will) Außerdem sollen von GameField weitere Klassen, durch Vererbung entstehen, will aber nicht, dass wenn ich eine Frucht erstelle, gleich eine neue Spielfeld Instanz erzeugen, oder wenn ich dann noch eine Snake Klasse erstelle das gleiche Problem haben.
Im Mittelpunkt ist nur diese Übergabe der Referenz auch wenn es für dieses Beispiel etwas unsinnig ist :), Ich brauch ja in der Klasse einen Zeiger oder eine Referenz die dann die übergebene Referenz des GameFields speichert bzw. auf die Elemente zugreifen kann.


Zu der Antwort auf diese Referenzenliste, ok kann ich dann nicht einen Zeiger übergeben ? Der Speicher für den Klassenzeiger wird ja in der Klasse unter protected reserviert und dann in dem Kopierkonstruktor aufgenommen wird, damit meine anderen Methoden auf die Daten der anderen Klasse zugreifen kann.

Aber danke erstmal für die Antwort :)
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

4

01.01.2014, 16:59

Zu der Antwort auf diese Referenzenliste, ok kann ich dann nicht einen Zeiger übergeben ? Der Speicher für den Klassenzeiger wird ja in der Klasse unter protected reserviert und dann in dem Kopierkonstruktor aufgenommen wird, damit meine anderen Methoden auf die Daten der anderen Klasse zugreifen kann.

[ ] Ich habe Initialization List in <Suchmaschine meiner Wahl> eingetippt
Wo siehst du hier eigentlich einen Kopierkonstruktor?

Ich brauch ja in der Klasse einen Zeiger oder eine Referenz die dann die übergebene Referenz des GameFields speichert bzw. auf die Elemente zugreifen kann.

Dann übergib eine Referenz, wo ist das Problem?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class GameField { /* bla bla bla */ };

class Fruit
{
public:
    Fruit(GameField& field)
        : myGameField(field) // Das ist eine Initialization List
    { }
    
private:    // protected whatever
    GameField& myGameField;
};


Und die Frage mit friend steht immer noch im Raum.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

5

01.01.2014, 23:32

Ahh perfekt Steef danke, jetzt funzt es :)

Naja um zu erklären warum friend hier geeigneter ist, müsste ich dir den gesamten source code zeigen und das würde Zeit brauchen und und und.
Mir war es wichtig wie ich auf die Daten anderer Klassen zugreifen kann ohne extra diese erben zu lassen.
Danke auf jeden Fall für deine Zeit.
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.01.2014, 23:42

Ich bin mir zu 99,99999999999999% sicher, dass friend hier keine gute Lösung ist. Wieso genau muss du auf die Daten anderer Klassen zugreifen? Was tun diese Daten in der anderen Klasse, wenn du sie doch offenbar eigentlich wo anders brauchst? Wenn tatsächlich von außen zugegriffen werden muss, wieso sind sie dann private? ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

04.01.2014, 15:59

Ich glaub die letzte Frage bringt ihn nur wieder auf noch schlimmere Ideen.
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]

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

8

05.01.2014, 14:46

Hehe, ja wenn es fertig ist stell ich euch das Projekt hier rein und dann dürft ihr Kritik üben, ansonsten ist es mein erstes annähernd objekt orientiert programmiertes Projekt. :this:
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Werbeanzeige