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:

    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).

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

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



  • spacegaier schrieb:

    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:

    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).

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

    Sind m_strength und m_speed zufällig Member-Variablen der Klasse player und dort "private"?
    Falls nicht, poste mal einen Code-Snippet, in dem du den Fehler reproduzieren kannst :).

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

    Kommt drauf an.
    Pro Referenz:
    "Einfachere" Handhabung, (* und -> entfallen).
    Sicherer, da sie nicht nicht-initialisiert sein kann.

    Kontra Referenz:
    Kann nicht 0 sein.
    Kann nicht "umgebogen" werden, d.h. kann während ihrer gesamten Lebensdauer nur ein und das selbe Objekt referenzieren.

    Gruß Caipi



  • m_strenght und m_speed sind neben weiteren Membervariablen in der Klasse hero (nicht player; player war nur der Name der Instanz) deklariert und sind alle public.

    Ist Code-Snippet = betreffendes Stück des Codes (Bin neu in einem Forum)

    Danke für die Antwort 🙂



  • spacegaier schrieb:

    m_strenght und m_speed sind neben weiteren Membervariablen in der Klasse hero (nicht player; player war nur der Name der Instanz) deklariert und sind alle public.

    Dann verstehe ich nicht, warum du Membervariablen an eine Memberfunktion per Zeiger übergeben musst.

    Soweit ich das jetzt verstanden habe, sieht deine Klasse ungefähr so aus:

    struct hero
    {
          int m_strength, m_speed; // etc.
    
          // ...
          void make_hero(int *m_strength, int *m_speed, ...)
          {
              ...
          }
          // ...
    };
    

    Was ist hierbei der Sinn? Du musst m_strength, etc. nicht an make_hero übergeben, da make_hero selbst auf m_strength, etc. bereits Zugriff hat...

    Btw.: Falls die Klasse wirklich so aussieht, könntest du die Zeile

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

    z.B. durch

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

    ersetzen um dem Compile-Fehler vorzubeugen... Allerdings rate ich dir dringenst davon ab und empfehle: Schau dir das allgemeine Konzept der Klassen noch einmal an :).

    Ist Code-Snippet = betreffendes Stück des Codes (Bin neu in einem Forum)

    Genau das :).

    Gruß Caipi



  • Danke Ciapi,

    hast vollkommen recht. Es ist völlig sinnfrei der Funktion die Variablen als Parameter zu übergeben. Mir kam es heute morgen auch.

    Danke für die Bestätigung meiner Vermutung.


Anmelden zum Antworten