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

11

06.01.2012, 13:01

Ich habe das mit der Referenz mal ausprobiert, in dem ich "void Update" als Parameter (CPlayer &Player) übergab. In Asteroid wurde die Funktion dann über "void CAsteroid::Update (Player)" aufgerufen. Das führte zu zwei Fehlern:
"error C2597: Ungültiger Verweis auf nicht-statischen Member 'CAsteroid::Player'"
"error C2448: 'CAsteroid::Update': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein"

Der erste lies sich entfernen, in dem in Asteroid.hpp ein "static" vor "CPlayer* Player;" geschrieben wurde. Den anderen Fehler verstehe ich ehrlich gesagt nicht so ganz... (habe mich mal was im Internet umgesehen, hab dort aber keine Lösung gefunden) oder habe ich da wieder komplatt was falsch gemacht?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

13

06.01.2012, 13:40

Der Code, an dem ich etwas verändert habe:


http://ideone.com/cewaw

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

14

06.01.2012, 13:47

So wäre es richtig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CAsteroid
{
        public:
                CAsteroid(CPlayer &Player) : Player(Player) {} //Konstruktor, initialisiert die Referenz Player mit der als Parameter übergebenen Referenz
                void Update   ();
                
        private:
                CPlayer &Player;
                float PlayerxPos;
 
 
 
void CAsteroid::Update () //braucht keine Parameter, da Player ein Klassenmember ist
{
        
        PlayerxPos = Player.GetxPos (); //Referenzen muss man nicht dereferenzieren (deswegen . statt ->)
        
} // Update


Du erzeugst jetzt mit CAsteroid myAsteroid(ObjektDesSpielers) eine Instanz der Klasse.
Falls du die Zeile CAsteroid(CPlayer &Player) : Player(Player) {} nicht verstehst, dann solltest du dir Konstruktoren und Initialisierungsleisten näher anschauen. Mir scheint, dass du Klassen noch nicht ganz verstanden hast.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

06.01.2012, 15:33

Um dein Problem oben noch mal genauer zu beschreiben, du mixt einfach zwei Herangehensweisen. Einerseits bekommt die Klasse einen Member "Player" und andererseits willst du Update den Player als Parameter mitgeben. An sich ist beides zulässig. Aber halt nicht beides mixen. BurningWave hat dir gezeigt wie du die Version mit Player als Membervariable umsetzen könntest. Wenn du die Updateparameter Version möchtest, musst du den Player aus der Klasse löschen.
„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.“

16

06.01.2012, 19:17

Habe mal den Code bisschen bearbeitet:

C-/C++-Quelltext

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
41
42
43
44
45
46
47
48
49
50
#include <iostream>

using namespace std;

class CPlayer
{
private:
    int m_xPos;
    int m_yPos;
public:
    CPlayer(){m_xPos = 100;m_yPos = 200;};
    float GetxPos(){return m_xPos;};
    float GetyPos(){return m_yPos;};
};//Player Klasse

class CAsteroid {

    public:
    CAsteroid(CPlayer &Player) :
    Player_2(Player) {cout << "Initialisierung hat problemlos funktioniert." << endl;} //Konstruktor, initialisiert die Referenz Player mit der als Parameter übergebenen Referenz
    void Update();
    void ZeigeWerte();

    private:
    CPlayer &Player_2;
    float PlayerxPos;
    float PlayeryPos;
};//Asteroid Klasse

int main()
{
    CPlayer Player;
    CAsteroid Meteorid(Player);
    Meteorid.Update();
    Meteorid.ZeigeWerte();
    system("pause");
    return 0;
}//Main

//Funktionsdefinitionen
void CAsteroid::Update ()
{
    PlayerxPos = Player_2.GetxPos ();
    PlayeryPos = Player_2.GetyPos ();
}// Update
void CAsteroid::ZeigeWerte()
{
    cout << "Xpos: " << PlayerxPos << endl;
    cout << "Ypos: " << PlayeryPos << endl;
}//Zeige Werte


Ach und nochmal zu der Stelle, wo du -> statt . gemacht hast.
Du musst wissen, dass Referenzen ----------> Spiegelbilder sind, d.h. sie haben die gleiche Adresse und verhalten sich identisch.
Bedenke jedoch, dass man sie nicht verändern sollte. Zusätzlich musst du sie sofort bei der Deklaration initialisieren.
Only God can judge me.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »denniro« (06.01.2012, 20:27)


17

06.01.2012, 21:08

Vielen Dank für eure Antworten, allerdings gibt es jetzt auf einmal in der Game.cpp Probleme, was ich irgendwie nicht so ganz verstehe, da diese Stelle nichts mit einem Verweis auf Player zu tun hat und auch sonst korrekt scheint.

Es handelt sich dabei um eine private Memberfunktion von Game:

http://ideone.com/bLkKq

error C2228: Links von ".Init" muss sich eine Klasse/Struktur/Union befinden.
error C2664: 'std::list<_Ty>::push_back': Konvertierung des Parameters 1 von 'CAsteroid (__cdecl *)(CPlayer &)' in 'const CAsteroid &' nicht möglich
1> with
1> [
1> _Ty=CAsteroid
1> ]
1> Ursache: Konvertierung von 'overloaded-function' in 'const CAsteroid' nicht möglich
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig

Diese Fehler verstehe ich ehrlich gesagt nicht so ganz. Ich würde mich freuen, wenn ihr mir auch hier noch einmal weiterhelfen könntet, da es ja mit eurer Lösung des Problems zu tun hat.

18

06.01.2012, 22:43

Das erste was mir auffällt ist, dass du hier:
CAsteroid Asteroid (CPlayer &Player);
statt eine Instanz zu erzeugen, du, erneut die Parameterliste des Konstruktors übernimmst, jedoch musst du hier, die Instanz, die von außen kommt, dieser Funktion übergeben.
Hoffe es ist verständlich.
lg denniro

Edit:

Ich weiß zwar nicht, wie die Funktion "Init" aussieht, aber das Casten(static_cast<float>(XPos)), könntest du weglassen und sofort bei der Funktion angeben, dass diese einen Parameter erwarten soll, der vom TYP Integer ist. Es wäre umständlich hier die Position in Float anzugeben, da Float bis auf die letzte Kommastelle genau ist, es sei denn, dass es deine Absicht ist.
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (06.01.2012, 22:53)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

19

06.01.2012, 22:46

Ja, in dieser Zeile liegt der Fehler.
Irgendwo erzeugst du den Spieler mittels CPlayer myPlayer; Hier musst du dann schreiben: CAsteroid Asteroid (myPlayer);

20

06.01.2012, 23:04

Das Problem könntest du lösen, indem du, der Funktion "SpawnAsteroids" in die Parameterliste, genau das schreibst, was sich momentan in der von "CAsteroid Asteroid" befindet. D.h. du musst den Inhalt der Parameterliste in den Funktionskopf von "SpawnAsteroids" schreiben und anschließend bei "CAsteroid Asteroid" in die Parameterliste die erzeugte Instanz, z.B. "myPlayer" einfügen.
Only God can judge me.

Werbeanzeige