Problem mit Gültikeisbereich von Klassen



  • Hallo,

    Ich wollte nur zum üben eine Verschachtelte Klasse machen für Benutzer.
    Ich habe also eine Klasse Buddys gemacht, in der alle Benutzer gespeichert sein sollen. Dafür habe ich in der Klasse Buddys dann eine Classe Buddy gemacht die dann für jeden User erstellt werden soll, wenn ich die Methode add aus Buddys aufrufe. Allerdings ist die erstellte Classe buddy member[] dann nur innerhalb der Methode add verfügbar:(

    #include <iostream>
    using namespace std;
    
    class buddys {
        private:
            int i_members;
    
        public:
    
             class buddy {
                public:
                    string name;
                    int counter;
                    buddy() {name = ""; counter = 0;}
            };
    
            buddys() { i_members=0;}
            int add (string newname) {
                i_members++;
                buddy member[i_members];
                member[i_members-1].name = newname;
                member[i_members-1].counter = 0;
                return (1);
            }
            string get_name (int i) {
                if (i < i_members) {
                    return (member[i].name);
                }else{
                    return ("FAIL");
                }
    
            }
    
    };
    
    int main() {
        buddys users;
        users.add("Test");
        users.add("Test");
        cout << "Name " << users.get_name(0) << endl;
    
        return (0);
    }
    

    Kann auch sein das ich da totalen schwachsinn gemacht habe, fange gerade erst an mit C++

    Danke im Voraus



  • vielleicht solltest du dir die ganzen buddy's auch noch irgendwo merken, ala std::vector<buddy> meine_buddies; und dann die neu gemachten dort rein puschen...

    int add (string newname) {
                i_members++; 
                buddy member[i_members];  // neuen array deklarieren
                member[i_members-1].name = newname; // den letzten davon mit daten füllen
                member[i_members-1].counter = 0;   // den letzten davon mit daten füllen
                return (1); // und hier ist der lokale scope weg und damit dein array auch ...
            }
    

    Du brauchst einen member der die neu erstellten buddies speichert - dafür bietet sich std::vector<buddy> an.

    #include <vector>
    #include <iostream>
    #include <string>
    class buddys {
    
             class buddy {
                public:
                    std::string name;
                    int counter;
                    buddy(std::string Name="", int Counter) : name(Name), counter(Counter) {}
            };
    
        // private: // ist 'class' schon automatisch 
            // int i_members; // entfällt
            std::vector<buddy> m_buddies;       
    
        public:
            void add (std::string newname) {
                m_buddies.push_back(buddy(newname));
            }
    
            std::string get_name (int i) {
                if (i < m_buddies.size() ) {
                    return (m_buddies[i].name);
                }else{
                    return ("FAIL");
                }
            }
    };
    

    Abgesehen davon ist such mal im Forum nach "ungarischer Notation", "using namespace std; in Headern", "Initialisierungsliste für Construktoren" - und inner classes sind zwar syntaktisch erlaubt - frag mich nur ob du das hier wirklich brauchst ...



  • Bekomme leider eine Fehlermeldung bei deinem Script

    bungen\Ausprobierer\main.cpp|11|error: default argument missing for parameter 2 of 'buddys::buddy::buddy(std::string, int)'|
    bungen\Ausprobierer\main.cpp||In member function 'std::string buddys::get_name(int)':|
    bungen\Ausprobierer\main.cpp|25|warning: comparison between signed and unsigned integer expressions|
    ||=== Build finished: 1 errors, 1 warnings ===|
    

Anmelden zum Antworten