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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

04.01.2006, 23:01

Zeiger als Funktionsparameter

Hallo,

ich habe ein Problem mit einer Funktion, die per Zeiger Membervariablen einer Klasse übernehmen soll. Jedes Mal wenn ich aber die Funktion aufrufen möchte meint der Compiler, dass die Variablen nicht deklariert seien.
Wo liegt also mein Problem?

Genauer:

Ich habe eine Klasse (in der Datei hro.cpp) in der ich verschiedene Variablen deklariere und später per Konstruktor initialisiere. In dieser Klasse ist auch die Funktion make_hero, welche einige der Membervariablen benötigt.
In dieser make_hero-Funktion werden diese Variablen verändert, weshalb ich ja einen Zeiger auf diese brauche.
=> Ich gebe als Parameter für make_hero die Zeiger auf die Membervariablen an:

C-/C++-Quelltext

1
void make_hero (int *m_strenght, int *m_speed, ...)


Beim Aufrufen dieser Funktion gebe ich als Parameter dann die Adresse der Variablen an (nachdem ich eine Instanz der Klasse namens player angelegt habe).

C-/C++-Quelltext

1
 player.make_hero (&m_strenght, &m_speed, ...)


Was mache ich falsch und wären hier Referenzen sinnvoller?

Anonymous

unregistriert

2

04.01.2006, 23:07

Zeig mal Deine Klassendeklaration und wo Du die Funktion aufrufst.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

3

04.01.2006, 23:10

poste mal den code...

ich glaube das die Funktion:

C-/C++-Quelltext

1
player.make_hero (&m_strenght, &m_speed, ...)


in der main() oder WinMain steht, die FUNKTIONSPARAMETER sind &m_strenght, &m_speed.

Diese sind private? Elemente der Klasse.
Da du eine Instanz der Klasse erstellt hast (player) greifst du auf die Methode make_hero zu und übergibts m_strenght und noch was. Wozu? m_strenght ist der Klasse doch schon bekannt. In der Main Funktion sind diese Speicherzellen "nicht sichtbar", deshalb Fehler.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

4

04.01.2006, 23:17

spacegaier

Also hier meine Klassedeklaration aus hero.hpp

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

using namespace std;

class hero
{

public:                                             //Membervariablen


    string m_name;
    int m_lifepoints;                               //Lebenspunkte

    int m_strenght;                                 //Stärke

    int m_speed;                                    //Geschwindigkeit

    int m_cleverness;                               //Schlauheit

    int m_skill;                                    //Geschicklichkeit

    int m_attack;                                   //Variable, die den Waffenumgangsgrad (Talent, Geschicklichkeit mit der Waffe...)darstellt (Verbesserung z.B. in der Kaserne...)

    int m_damage;                                   //Angriffswert (der tatsächliche mit dem Feinden zugesetzt wird = Kombo aus AG, Speed...)

    int m_defense;                                  //Variable, die den Grad des Umgangs mit der Waffe zur Verteidigung Talent, Geschicklichkeit mit der Waffe...)darstellt (Verbesserung z.B. in der Kaserne...)

    int m_protection;                               //Verteidigungswert (der tatsächliche mit dem Feinde abgewehrt werden = Kombo aus VG, Speed...

    int m_magic_strenght;                           //Magiekraft


    int m_goldcoins;                                //Goldmuenzen                       

            
    string m_weapon;                                //Waffe

    int m_attack_value_weapon;                      //Angriffswert der Waffe

    string m_shoes;                                 //Schuhwerk

    int m_defense_value_shoes;                      //Verteidigungswert des Schuhwerks

    string m_armor;                                 //Kleidung/Ruestung

    int m_defense_value_armor;                      //Verteidigungswert der Kleidung/Ruestung



    hero ();
    int calculate_m_attack ();
    int calculate_m_defense ();
    void make_hero (int &m_strenght, int &m_speed, int &m_cleverness, int &m_skill, int &m_attack, int &m_defense);
    void show_hero_values   ();                     //Memberfunktion um die Characterwerte anzuzeigen

    void show_hero_inventory ();

};


Und hier hero.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include "hero.hpp"

using namespace std;

hero::hero ()
{
    m_lifepoints = 100;                             
    m_strenght = 1;                                 
    m_speed = 1;                                    
    m_cleverness = 1;                               
    m_skill = 1;                                    
    m_attack = 1;               
    m_damage;                                   
    m_defense = 1;      
    m_protection;                                   
    m_magic_strenght = 0;

    m_goldcoins = 20;                                                   
    m_weapon = "kleines Messer";                        
    m_attack_value_weapon = 2;      
    m_shoes = "Stoffschuhe";                        
    m_defense_value_shoes = 1;          
    m_armor = "langes Leinenhemd";                      
    m_defense_value_armor = 1;
}

(hier sind noch die anderen Funktionen)

void make_hero (int *m_strenght, int *m_speed, int *m_cleverness, int *m_skill, int *m_attack, int &m_defense)
{
    int rest = 10;
    char choose_value;

    
    
    cout << "Du darfst nun 10 Charakterpunkte auf die verschiedenen Charaktereigenschaften beliebig verteilen.";
    cout << "Welchen Wert moechtest du erhoehen?\t(Noch " << rest <<" Punkte uebrig";
    
    do {    
    
    cout << "\n\t\ta)   (S)taerke\n\t\tb)   (G)eschwindigkeit\n\t\tc)   (I)ntelligenz\n\t\td)   G(e)schicklichkeit\n\t\te)   (A)ttacke (= wie gut du angreifen kannst; ist nicht der Schadenswert)\n\t\tf)   (V)erteidigung (= wie gut du dich verteidigen kannst; ist nich der Schutzwert!)\n\t\t   ";
    cin >> choose_value;

    switch (choose_value)
    {
    case ('s'):
        {
    cout << "Der Staerkewert wurde um einen Punkt erhoeht.\n";
    (*m_strenght)++,
    rest--;
        }
    case ('g'):
        {
    cout << "Der Geschwindigkeitswert wurde um einen Punkt erhoeht.\n";
    (*m_speed)++;
    rest--;
        }
    case ('i'):
        {
    cout << "Der Intellingezwert wurde um einen Punkt erhoeht.\n";
    (*m_cleverness)++;
    rest--;
        }
    case ('e'):
        {
    cout << "Der Geschicklichkeitswert wurde um einen Punkt erhoeht.\n";
    (*m_skill)++;
    rest--;
        }
    case ('a'):
        {
    cout << "Der Angriffswert wurde um einen Punkt erhoeht.\n";
    (*m_attack)++;
    rest--;
        }
    case ('v'):
        {
    cout << "Der Verteidigungswert wurde um einen Punkte erehoeht.\n";
    (*m_defense)++;
    rest--;
        }
    default:
    {
        cout << "Ungueltige Eingabe!\n";
    }}
    } while (rest != 0);
}


Und hier der Aufruf in einer anderen Datei (=Problem ?)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
.......
hero player;

player.make_hero (&m_strenght, &m_speed, &m_cleverness, &m_skill,& m_attack, &m_defense);
            player.calculate_m_attack ();
            player.calculate_m_defense ();
            player.show_hero_values (); 
.........
    

Anonymous

unregistriert

5

04.01.2006, 23:20

Tipp: Mehrdeutige Variablennamen. Im einen heißt die Variable so, im anderen heißt sie genau so usw.

(Irgendwie habe ich das Gefühl, das im Buch dieser Fehler gemacht wurde, das ist jetzt schon das 4. mal innerhalb von 2 Wochen das ich diesen Fehler sehe)

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

6

04.01.2006, 23:21

spacegaier

Achtung habe etwas falsch gepostet !!!

In der Datei hero.cpp heisst es

C-/C++-Quelltext

1
2
void hero::make_hero (int *m_strenght, int *m_speed, int *m_cleverness, int *m_skill, int *m_attack, int &m_defense)
.......
[/cpp]

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

7

04.01.2006, 23:26

Zitat

Im einen heißt die Variable so, im anderen heißt sie genau so usw.


Was meinst du damit: Sind m_attack und m_attack_value_weapon sich vom Namen her zu ähnlich?

Anonymous

unregistriert

8

04.01.2006, 23:33

C-/C++-Quelltext

1
    int m_attack;                                    //Variable, die den Waffenumgangsgrad (Talent, Geschicklichkeit mit der Waffe...)darstellt (Verbesserung z.B. in der Kaserne...)

C-/C++-Quelltext

1
void hero::make_hero (int *m_strenght, int *m_speed, int *m_cleverness, int *m_skill, int *m_attack, int &m_defense)

C-/C++-Quelltext

1
2
3
4
player.make_hero (&m_strenght, &m_speed, &m_cleverness, &m_skill,& m_attack, &m_defense); 
            player.calculate_m_attack (); 
            player.calculate_m_defense (); 
            player.show_hero_values ();   

Klar beim 3. ist die frage wo wird m_attack z.B. deklariert? Und vorallem: WARUM da m_??

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

9

04.01.2006, 23:46

spacegaier

1. Teil: m_ weil Membervariable
2. Teil: wäre *pm_attack besser (p für Pointer; m_ weil es ein Zeiger auf die Membervariable ist) [soll übrigens *m_defense heissen]
3. Teil: das m_attack ist das aus der Klasse hero [in den funktionen cal_caculate_..... muss m_attack durch m_damage und m_defense druch m_protection ersetzt werden] :wall:

Habe den Code zu oft in der letzten Zeit verändert => die Fehler in []

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

05.01.2006, 08:28

hier gibts auch ein Problem, wieder mit Variblennamen.

C-/C++-Quelltext

1
2
3
4
5
6
hero player;

player.make_hero (&m_strenght, &m_speed, &m_cleverness, &m_skill,& m_attack, &m_defense);
            player.calculate_m_attack ();
            player.calculate_m_defense ();
            player.show_hero_values ();


Du hast alles Public gemacht in der Klasse gemacht (was zwar nnicht den sinn erfüllt) aber gut. Du kannst m_speed nicht durch m_spedd ausserhalb der Klasse ansprechen! Du musst sagen: player.m_speed, allso müsste der Aufruf so in etwa sein....

C-/C++-Quelltext

1
2
3
4
player.make_hero (&player.m_strenght, &player.m_speed, &player.m_cleverness, .....);
            player.calculate_m_attack ();
            player.calculate_m_defense ();
            player.show_hero_values ();


hero ist doch eigentlich nicht nur deine Klasse, soondern auch eeine Art Namespace.... pprobier mal in der Klassendefinition irgendwo m_speed durch hero::m_speed zu ersetzen! Es funktioniiert....

Werbeanzeige