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

12.12.2014, 14:31

C++ Hilfe, Klassenvariablen in main.cpp benutzen

Hallo!

Habe da ein kleines Problem. Ich habe eine Klasse erstellt und eine dazugehörige Quelldatei. Nun möchte ich eine Funktion haben womit sich ein Spieler seinen Namen aussuchen kann. Der Name soll im gesamten Programm angezeigt werden können.

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
Klasse.hpp
class C_Klasse
{
protected:
char m_Name[15];

public:
void NamenGeben();
};

Klasse.cpp
void C_Held::NamenGeben()
{
cout << "Namen eingeben: ";
cin.ignore();
cin.get(m_Name, 14);
}

main.cpp
int main()
{
C_Klasse Spieler;

Spieler.NamenGeben();

cout << "Ich heiße " << Spieler.m_Name << endl;
return 0;
}


Ich möchte den Namen an mehreren Stellen im Code ausgeben. In meinem Beispiel kann nicht auf Spieler.m_Namezugegriffen werden. Habs über get/set oder Pfeiloperator versucht, nix funkt. Weiß jemand weiter oder kennt 1-2 andere/bessere Möglichkeiten?

lg
Boro

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Boromire« (19.12.2014, 13:48)


ExCluSiv3

Frischling

Beiträge: 61

Wohnort: Düsseldorf

Beruf: Fachinformatiker - Ausbildung

  • Private Nachricht senden

2

12.12.2014, 14:38

Der Code deiner Klasse hilft da wenig weiter, du musst schon ein Code beispiel (dafür gibts übrigens den Code Tag, dann kann mans leichter lesen) zeigen, mit dem was du versucht hast.

Und wenn es schon an so Grundlegenden und Elementaren dingen hapert würde ich vllt. doch noch mal ein Buch über C++ lesen ;)

Edit:

Da ist mir gerade noch was aufgefallen:

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
Klasse.hppclass C_Klasse
{
protected:
char m_Name[15];

public:
void NamenGeben();
};

Klasse.cpp
void C_Held::NamenGeben()
{
cout << "Namen eingeben: ";
cin.ignore();
cin.get(m_Name, 14);
}

main.cpp
int main()
{
C_Klasse Spieler;

Spieler.NamenGeben();

cout << "Ich heiße " << Spieler.m_Name << endl;
return 0;
}



In der Header hast du einen anderen Klassennamen als du in der Cpp Referenzierst

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

3

12.12.2014, 14:42

Warum hast du den Name protected und nicht private?

Wenn du Zeichenketten benutzen willst, dann guck dir erstmal std::string an. Damit lässt es sich schonmal leichter arbeiten als mit char* oder char[].

Du sagst, du hast es mit Getter/Setter versucht und es hat nicht funktioniert. Wie sah denn dein Ansatz aus und was kam da am Ende bei rum? Eigentlich ist das ja der normale Weg, den Namen als Eigenschaft des Spielers zu machen und diesen per Setter oder direkt im Konstruktor zu setzen. Mittels Getter kann dann an jeder Stelle, wo der Spieler bekannt ist, auf den Namen zugegriffen werden.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

12.12.2014, 14:48

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

class Spieler{
    public:
        std::string name; 
};

Spieler spieler; // globale Variable

int main(int argc, char** args){
    std::cout<<"Wie heißt du?"<<std::endl;
    std::cin>>spieler.name;
    std::cout<<"Hallo "<<spieler.name<<"!"<<std::endl;

    return 0;
}

5

19.12.2014, 13:46

Sorry das ich erst jetzt schreibe. Hier der Quellcode für get/set. Möchte das ganze ohne globale Variablen zum laufen bringen.

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
// Klasse.hpp
class C_Klasse
{
private:
    string m_Name;
public:
    void setName(string n);
    string getName();
};

// Klasse.cpp
void C_Klasse::setName(string n)
{
    m_Name = n;
    cout << "Namen eingeben: ";
    cin.ignore();
    cin >> n;
}

string C_Klasse::getName()
{
    return m_Name;
}

//main.cpp
int main
{
    C_Klasse Spieler;

    Spieler.setNamenGeben();

    cout << "Dein Name ist: " << Spieler.getNamenGeben() << endl;
    
    return 0;
}


Was ist falsch bzw. wie geht es besser?

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

6

19.12.2014, 14:00

Copy/Paste Fehler? Du rufst in der main Funktionen auf, die es nicht gibt. Das sollte dir dein Compiler aber auch sagen. Außerdem liest du niergends einen Namen ein.

Ansonsten solltest du Seiteneffekte in Methoden vermeiden. Also keine Textaus-/eingaben im Setter etc., zumal die Ausgabe sowieso keinen Sinn macht.

7

19.12.2014, 14:31

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

class C_Klasse           
{
private:
    std::string m_Name;
public:
    void setName();
    std::string getName();
};


void C_Klasse::setName()
{
    std::cout << "Namen eingeben: ";
    std::cin >> m_Name;                                   //Hier wird der Name eingegeben
}

std::string C_Klasse::getName()
{
    return m_Name;                                          //Hier wird dieser zurückgegeben, um damit zu arbeiten
}

int main()
{

C_Klasse Test;
Test.setName();                                               //Siehe Funktion setName()

std::cout << "Dein Name ist: " << Test.getName();      //siehe Funktion getName()
return 0;
}





Alternativ kannst du bei der Funktion getName noch ein const hinzufügen, aber das dürfte wahrscheinlich fürs erste zu viel für dich sein. Wenn du noch kein Buch hast, dann leg dir eins zu und lern schön fleißig. :thinking:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

20.12.2014, 12:18

Nimm die Tastaturabfrage aus der Set Methode heraus. Pack den Teil lieber in die Mainfunktion. Übergib der Set Methode dann lieber den String welcher über die Tastatur eingelesen wurde als Parameter um den Namen neu zu setzen.

edit:
Und public Variablen sind noch keine globalen Variablen. Globale Variablen sind nicht Teil einer Klasse sondern sind unabhängig davon. Dennoch sollte man versuchen public Variablen zu vermeiden.

C-/C++-Quelltext

1
2
3
4
5
6
7
int someGlobalVariable; // diese Variable ist global.

class SampleClass
{
public:
  int somePublicVariable; // diese Variable ist public aber nicht global
};
„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.“

Werbeanzeige