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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

17.12.2013, 10:40

Das hängt immer davon ab, was man übergibt und wie strong das sein soll. Beziehungsweise wie stark das Ziel-Objekt das übergebene Objekt halten soll oder darf. Darf diese Eigenschaft null sein oder geändert werden -> *. Andernfalls &.
Zumindest wäre das aus meiner Sicht sinnvoll, umsetzen tu ich's meist so, dass der Typ rein geht, der eben gerade vorliegt. Liegt das Objekt schon als * vor, dann übergebe ich's meist auch so in neu erstellte Methoden rein. Andernfalls eben als &.
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]

12

17.12.2013, 11:34

Ich handhabe es auch so, wie BC beschrieben hat: Referenzen als Parameter, wenn kein nullptr übergeben werden darf, sonst Pointer (zumindest solange die Auswahl auf diese beiden Typen beschränkt ist). Analog dazu gebe ich auch Referenzen anstatt Pointer zurück, wenn als Rückgabewert kein nullptr zu erwarten ist.

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

13

17.12.2013, 13:07

Ah OK danke, dann werde ich das auch so machen.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

14

17.12.2013, 21:02

Ich übergebe per *, wenn das Ding ein Objekt ist. Vorallem bei so großen Objekten lässt sich eine Instanz über Zeiger verwalten.
& verwende ich kaum nur als const &, wenn ich keine Veränderung erwarte.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

17.12.2013, 21:28

Const sollte man so oder so immer benutzen, wenn keine Zustands-Änderung des Objekts erfolgt. Const-Correctness ist ein sehr großes Thema in C++.
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]

Meldorian

Frischling

Beiträge: 9

Wohnort: Bielefeld

  • Private Nachricht senden

16

19.08.2014, 07:25

Moin,

auch wenn die Erstellung des Themas schon ein wenig zurück liegt, greif ich es mal auf, da ich selbiges Problem habe.

Ich möchte zwei Instanzen einer Klasse an eine Funktion übergeben, welche dann Änderungen an den Membervariablen vornimmt, welches laut "C++ für Spieleprogrammierer" mit Pointern geschehen sollte. Mein Quellcode lautet wie folgt:

CSpieler.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Klasse CSpieler
class CSpieler
{
    public:
    
        //Membervariablen
        //
        char m_Name[30];
        char m_Symbol;

        //Memberfunktionen
        //
        void NameAbfragen ();
        void SymbolAbfragen ();
        void ZeigeDaten ();
};


main.cpp

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//Tic Tac Toe in C++ - Konsolenanwendung
//
#include <iostream>
#include "CSpieler.hpp"

using namespace std;

//Funktionsprototypen
void ErstelleSpieler (CSpieler *pSpieler1, CSpieler *pSpieler2);
void SpielBeenden ();

//(...)

//Hauptprogramm
//
int main ()
{
    //Spieler erstellen
    CSpieler *pSpieler1 = NULL;
    CSpieler *pSpieler2 = NULL;
    pSpieler1 = new CSpieler;
    pSpieler2 = new CSpieler;

    //Hauptmenü
    
    //(...)

    //Spielstart
    if (SpielInitialisierd == false)
    {
        //(...)

        do
        {
            cout << "1 - Spiel initialisieren" << endl;
            cout << "2 - Spiel beenden" << endl;

            cout << "\nIhre Auswahl: ";
            cin >> ch_Auswahl;

            switch (ch_Auswahl)
            {
                case ('1'):
                {
                    cout << "\nSpiel wird initialisiert\n" << endl;
                    
                    ErstelleSpieler (&pSpieler1, &pSpieler2); //<--- Was ist hier falsch?
                    //LoescheSpielfeld ();

                    SpielInitialisierd = true;              
                } break;
                case ('2'):
                //(...)
            }
    }
    
    //(...)

    //Spieler löschen
    delete pSpieler1;
    pSpieler1 = NULL;
    delete pSpieler2;
    pSpieler2 = NULL;

    return 0;
}


Wenn ich mein Programm kompilieren will, erhalte ich folgenden Fehler:

Zitat

.\main.cpp(72) : error C2664: 'ErstelleSpieler': Konvertierung des Parameters 1 von 'CSpieler **' in 'CSpieler *' nicht möglich

17

19.08.2014, 08:05

Mach das '&' bei ErstelleSpieler weg und les das Kapitel nochmal :D

Meldorian

Frischling

Beiträge: 9

Wohnort: Bielefeld

  • Private Nachricht senden

18

19.08.2014, 08:09

Wenn ich das "&" entferne, dann bekomm ich folgende Fehlermeldung.

Zitat

1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl SpielBeenden(void)" (?SpielBeenden@@YAXXZ)".
1>D:\Daten\Dokumente\C++ & 3D Spieleprogrammierung\Projekte\TicTacToe\Release\TicTacToe.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.


Edit: K, nachdem ich alle "SpielBeenden" Sachen ausgeklammert habe, ist der Fehler weg. Da schau ich gleich nochmal drüber. Wieso musste ich jedoch das "&" entfernen? &pSpieler1 liefert mir doch die Speicher-Adresse der Variablen (bzw. in diesem Fall der Klasse) oder irre ich?

19

19.08.2014, 08:15

C-/C++-Quelltext

1
2
3
4
CSpieler *pSpieler1 = NULL;
CSpieler *pSpieler2 = NULL;
pSpieler1 = new CSpieler;
pSpieler2 = new CSpieler;


Das ganze sind schon Pointer.

EDIT:

Zitat

1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl SpielBeenden(void)" (?SpielBeenden@@YAXXZ)".


SpielBeenden wird vermutlich nur deklariert jedoch nicht definiert sein?

Meldorian

Frischling

Beiträge: 9

Wohnort: Bielefeld

  • Private Nachricht senden

20

19.08.2014, 08:19

C-/C++-Quelltext

1
2
3
4
CSpieler *pSpieler1 = NULL;
CSpieler *pSpieler2 = NULL;
pSpieler1 = new CSpieler;
pSpieler2 = new CSpieler;


Das ganze sind schon Pointer.


Also hab ich an dieser Stelle "doppelt gemoppelt" - leuchtet mir nun ein.


EDIT:

Zitat

1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl SpielBeenden(void)" (?SpielBeenden@@YAXXZ)".


SpielBeenden wird vermutlich nur deklariert jedoch nicht definiert sein?


Jup, hatte die Definierung mit ausgeklammert :)

Danke für die Hilfe!

Werbeanzeige