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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

21

05.01.2009, 19:50

Zitat von »"Spiri"«


Weil das zu globalen Variablen gehört.


Abgesehen davon, dass das nicht stimmt. Auch globale Variablen haben ihre Daseinsberechtigung.
@D13_Dreinig

22

05.01.2009, 19:51

ich glaub nicht das eine Variable global ist wenn du sie innerhalb einer Klasse als public machst.

Versuch doch dann mal außerhalb einer Klasseninstanz auf eine Variable zuzugreifen ...

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

23

05.01.2009, 19:51

Zitat von »"Spiri"«

Zitat von »"David_pb"«

Zitat von »"Spiri"«

Also noch mal:

Ich suche eine Möglichkeit, wo man den Code so coden kann, dass ich private Member-Variablen so verwenden kann, als wären es Membervariablen von public.


Wieso machst du sie nicht öffentlich?


Weil das zu globalen Variablen gehört.
Ich habe die einmal beschimpft, seitdem gibt er mir immer Fehlermeldungen...


Wenn du die Variable innerhalb der Klasse als public deklarierst, dann ist sie nicht Global, sondern immer noch nur mit einem Objekt bzw Instanz von der Klasse aufzurufen. Dann aber ohne Get denke mal das möchtest du ..

24

05.01.2009, 19:52

Zitat von »"David_pb"«

Abgesehen davon, dass das nicht stimmt. Auch globale Variablen haben ihre Daseinsberechtigung.

Geschmackssache.
Ich sage mal, es gibt keinen Fall, wo man nicht ohne globale variablen auskommen kann, nur das der aufwand irgendwann nicht mehr gerechtfertigt ist. Wo da genau die grenze ist, ist wie gesagt, geschmackssache ;)

Anonymous

unregistriert

25

05.01.2009, 19:53

Zitat von »"Toa"«

Zitat von »"Spiri"«

Zitat von »"David_pb"«

Zitat von »"Spiri"«

Also noch mal:

Ich suche eine Möglichkeit, wo man den Code so coden kann, dass ich private Member-Variablen so verwenden kann, als wären es Membervariablen von public.


Wieso machst du sie nicht öffentlich?


Weil das zu globalen Variablen gehört.
Ich habe die einmal beschimpft, seitdem gibt er mir immer Fehlermeldungen...


Wenn du die Variable innerhalb der Klasse als public deklarierst, dann ist sie nicht Global, sondern immer noch nur mit einem Objekt bzw Instanz von der Klasse aufzurufen. Dann aber ohne Get denke mal das möchtest du ..


Wozu ist dieses doofe private dann gut? :(

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

26

05.01.2009, 19:55

Zitat von »"Spiri"«


Wozu ist dieses doofe private dann gut? :(


Um die Implementierung von der Schnittstelle zu trennen. Der Benutzer einer Klasse hat es nicht zu interessieren, wie eine Funktion etwas macht, und schon gar nicht zu bestimmen wie sie sich verhält. Darum wird alles über Schnittstellen (Funktionen) geregelt, wo der Programmierer der Klasse immer die Oberhand hat und alles kontrolieren kann.
Boundchecks? - Durch setter kein Problem. Ohne wirds für den Programmierer der Klasse unmöglich.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

27

05.01.2009, 19:56

Zitat von »"Spiri"«


Wozu ist dieses doofe private dann gut? :(


Das doofe private ist gut um Teile von deinem Objekt nach außen unsichtbar zu machen. Es ist ja nicht Sinn und Zweck das du für jede Membervar Lese- und Schreibzugriff per Funktion bereitstellst.
@D13_Dreinig

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

28

05.01.2009, 19:56

Naja in großen Projekten hast du viele Klassen und viele Member und viel Code. Da verliert man mal schnell den Überblick und wenn man dann einfach über die Instanz der Klasse das Attribut verändern kann, könnte es vorkommen das du das Attribut an einer stelle manipulierst an der du es gar nicht möchtest..

€: Das ist das OOP Konzept. Globale Variablen kannst du ja von überall aus ändern bzw drauf zugreifen. Bei großen Projekten hat sich dann das Problem gebildet, dass man keinen Überblick mehr hatte und in tausenden Funktionen dauernd direkt auf Globale Variablen zugegriffen hat. Und das Ende vom Lied ist, das du nicht mehr weißt was eigentlich nun in der Variable steht. An dieser Stelle kommt das OOP Konstrukt ins Spiel, welches die nicht nur die Lesbarkeit des Codes optimiert, sondern auch gleich das Problem mit dem Zugriff regelt über genau diese Sache mit dem Privat und Public, welches du nicht verstehst^^

€2: Wiedermal zu spät, schließe mich meinen Vorpostern an.. :roll:

Anonymous

unregistriert

29

05.01.2009, 19:59

aso...
okee...
danke...

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

30

05.01.2009, 20:18

Re: get und set

Spiri:
Du hast in deiner set methode einen Parameter namens "m_Name". Das ganze ist ein Zeiger auf ein char. Wenn du nun m_Name = "sonstwas" schreibst, gibst du dem Zeiger eine andere Zieladresse. Dne Zeiger wiederum weisst du deinem Member "m_Spielername" zu, was dazu führt, dass er auf die selbe Adresse zeigt. Wenn du nun deine methode wie folgt aufrufst:

C-/C++-Quelltext

1
2
3
4
CPlayer player;
player.set("Faule_Socke");

std::cout << "Name: " << player.get();


Dann wird nicht etwa "Faule_Socke" rauskommen. Auch nicht "Luca". Sondern nur "L". Das liegt daran, dass du ein einzelnes Zeichen zurückgibst. Um dieses Zeichen zu erhalten dereferenzierst du deinen Zeiger m_Spielername. Da du aber wie gesagt nur ein Zeichen zurückgibst, wird halt nur das erste Zeichen genommen, nämlich das "L" von "Luca". Die Lösung ist gar nicht allzu schwer.

1. Du solltest std::string verwenden. Das erleichtert dir vieles.
2. Gib deiner set methode einen anderen Namen. Nenn sie setSpielername oder setPlayerName oder sowas in der richtung. Was ist, wenn du später auch noch die versuche und punkte setzen willst?
3. Das gleiche mit der get methode
4. Falls du schon soweit bist, macht deine get methode const.

Das resultat sieht dann so aus (veränderte Zeilen habe ich mit //!!! markiert):

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
#include <iostream>
#include <string> //!!!

class CPlayer
{ 
private: 

    std::string m_Spielername; //!!!

    float m_Versuche; 
    long m_Punkte; 

public: 

    void setSpielername (const std::string &name) //!!!

    { 
        //m_Name = "Luca"; //!!! Diese Zeile muss weg!!!!!!

        //m_Spielername = m_Name; // ändern:

        mSpielername = name;

        // Bau dir hierfür auch noch eigene setter und getter methoden

        //m_Versuche = 0; 

        //m_Punkte = 0; 

    } 

    const std::string &getSpielername () const//!!!

    { 
        return m_Spielername; 
    } 
};


Der oben gepostete Testcode sollte nun einwandfrei funktionieren. (Wenn ich "Socke" übergebe kommt auch wieder "Socke" raus.

Socke

Werbeanzeige