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

31.07.2013, 03:17

[c++] Eigenschaften übergeben

Morgen,

Ich habe einer mehr oder weniger dämliche Einsteigerfrage,
und zwar habe ich eine Klasse für die Stats/Eigenschaften des Spielers erstellt( Rang, Gold, usw... ).

Und ich schreibe dort unter anderem auch diese sachen als zum Zweck einer Speicherfunktion in eine Datei.
Nur brauche ich diese Eigenschaften zb. wie viel Gold zur verfügung steht natürlich in anderen Klassen, aber da komm ich irgendwie in Probleme.
Ich will diese Eigenschaften nicht Global machen und ich finde es ist auch kein guter Weg für jede einzelne eine Get-funktion zu schreiben.
Wie mach ich das nu?

Player.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once

class Cplayer
{
public:

void setStates(std::string &TempName));
//....

private:

int gold;
std::string Rang;
std::string Name;
int Level;
// etc..
};


Player.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include "Player.h"

void Cplayer::setStats(std::string &TempName)
{

    gold = 10;
    Level = 1;
    Rang = "anfänger";
    Name = TempName;
    // etc...

}



außerdem hätte ich noch eine Frage was eben dieses Speichern angeht:

so sehen die Funktionen bei mir aus:

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
void Cplayer::writeStats()
{
    
    std::ofstream Output("data/saves/save.sv");

    Output.write((char*) &gold, sizeof (gold));
    Output.write((char*) &Level, sizeof (Level));
    gold = 0;
    Output.close();
    

}

void Cplayer::readStats()
{
    
    std::ifstream Input("data/saves/save.sv");

    Input.read((char*) &gold, sizeof (gold));
    Input.read((char*) &Level, sizeof (Level));
    std::cout << gold << std::endl;
    Input.close();


}



Ist das den wirklich eine gute Methode dafür, ich bin mir nicht sicher ob auf einzelne Sachen den so gut zugegriffen werden kann , so kanns verstehe ich das nicht wie das überhaupt geht. Bräuchte ich nicht so etwas wie einen Index bzw. eine ID die den einzelnen Inhalten zugewiesen wird, damit ich weiß welcher Wert für was steht wenn ich die datei lese?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Dontyousay« (31.07.2013, 04:33)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

31.07.2013, 10:48

Die Frage, die du dir stellen solltest, ist: Wieso braucht eine andere Klasse direkten Zugriff auf diese Eigenschaft?

3

31.07.2013, 12:07

Nun, eine Möglichkeit wäre es(abgesehen von dem Sinn dahinter, dass dir Klasse darauf zugreifen muss), dass du diese andere Klasse als friend-Klasse markierst und über diese andere Klasse somit auf die Eigenschaften zugreifen darfst.Allerdings ist das ein schlechter Stil, da du ja Datenkapselung lockerst...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

31.07.2013, 12:58

Es ist halt überhaupt fraglich, wieso etwas ein private Member sein soll, wenn jemand von außen direkt drauf zugreifen muss... ;)

5

31.07.2013, 14:48

Zitat

Die Frage, die du dir stellen solltest, ist: Wieso braucht eine andere Klasse direkten Zugriff auf diese Eigenschaft?


Naja das sind ja sich ständig ändernde Member Variablen die von verschiedenen Klassen ständig geändert werden müssen, zb. Gold . Ansonsten müsste ich doch jede eventualität die dazu führt das der Goldwert des Spielers seigt oder sinkt in diese Klasse schreiben.

Zitat

Es ist halt überhaupt fraglich, wieso etwas ein private Member sein soll, wenn jemand von außen direkt drauf zugreifen muss... ;)
Also soll ich sie dann alle public machen ? Ich wollte das eigentlich vermeiden ? ?(

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

6

31.07.2013, 14:53

Was spricht gegen eine get()-Methode?
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

7

31.07.2013, 14:56

get()-Funktionen werden gerne als "unschöner Umweg" um die Kapselung von Klassen bezeichnet.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

8

31.07.2013, 15:01

Das hängt ja wohl davon ab, wie ich sie verwende, oder?
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

31.07.2013, 15:30

Ein get allein ist auch nicht weiter tragisch, wenn man nicht überall auch ein set hat. Die Frage von dot ist allerdings noch nicht ganz beantwortet. Wenn es darum geht zu wissen, wie viel Gold der Spieler hat, klar, warum kein "getAmountOfGold()" (anstatt "getGold()", denn das sollte ja das Gold des Spielers an sich zurückliefern und nicht nur die Anzahl seiner Münzen) und eine "giveGold(amount)" und "seizeGold(amount)" Methoden?
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

31.07.2013, 15:43

Naja das sind ja sich ständig ändernde Member Variablen die von verschiedenen Klassen ständig geändert werden müssen, zb. Gold .

Wieso muss der Goldwert von außen direkt geändert werden? Wenn dem so ist, wieso ist er dann in der Klasse?

Werbeanzeige