String erneut verwenden als Objektname



  • Hallo lieber C++ Freunde,

    ich bin noch ziemlich neu in C++, hier meine Frage:

    Ich habe einen Vector "Namen" mit verschiedenen Namen, sagen wir mal Peter, Hans und Paul. Nun habe ich eine Class Person mit der Funktion setAlter. Später möchte ich nun Peter als Member der Class Person erstellen und ihm ein Alter zuweisen. Meine Versuch

    #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Person
    {
    public:
    	//Funktionen
    	void setAlter(int x)
    	{
    		Alter = x;
    	}
    
    private:
    
    	int Alter;
    };
    
    int main()
    {
    	vector<string> Namen;
    	Namen.push_back("Peter");
    	Namen.push_back("Hans");
    	Namen.push_back("Paul");
    	string a;
    	a = Namen[0];
    
    	Person a;
    	a.setAlter(44);
    }
    

    gibt im Falle des Codebeispiels die Fehler :
    error C2039: 'setAlter' : is not a member of 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>

    error C2371: 'a' : redefinition; different basic types Test

    IntelliSense: class "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" has no member "setAlter"

    Wie kann ich das umgehen und den bereits deklarierten Namen hier noch als Klassenmember verwenden ? Ich hoffe ihr versteht was ich meine

    Gruß jimbo





  • In Zeile 29 sagst du, dass a ein string ist. In Zeile 32 sagst du, dass a eine Person ist. Das widerspricht sich. Du musst dich für eins entscheiden und das andere löschen.



  • Danke,aber das ist mir klar. Allerdings kann ich ja auch nicht direkt schreiben:
    Person Namen[0]
    um Peter als Member der Personenklasse zu erzeugen. Das wollte ich so umgehen. Schreibe ich es direkt als Person Namen[0] kommen auch Fehlermeldungen.

    Also noch mal anders. Ich will Person Peter erzeugen. Der String "Peter" liegt aber schon in dem vector Namen. Wie rufe ich den dann beim erzeugen von dieser Person auf ?



  • Du kannst Variablennamen nicht dynamisch anlegen. Das was du machen willst würde man ungefähr so machen:

    #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Person
    {
    public:
        Person(const string &name) : Name(name){
        }
        //Funktionen
        void setAlter(int x)
        {
            Alter = x;
        }
    
    private:
        string Name;
        int Alter;
    };
    
    int main()
    {
        vector<string> Namen;
        Namen.push_back("Peter");
        Namen.push_back("Hans");
        Namen.push_back("Paul");
        Person a(Namen[0]);
        a.setAlter(44);
    }
    


    • Später möchte ich nun Peter als Member der Class Person erstellen und ihm ein Alter zuweisen.

    Das wäre dann

    class Person
    {
    public:
        void setAlter(int x)
        {
            peter = x;
        }
    private:
        int peter;
    };
    

    Und das willst du sicher nicht.

    Person Namen[0]

    Das erstellt ein Array von Personen mit der Größe 0.

    • Der String "Peter" liegt aber schon in dem vector Namen. Wie rufe ich den dann beim erzeugen von dieser Person auf ?

    Wie willst du nen string aufrufen ? 😕

    • Nimm das:
    class Person
    {
    public:
        person(string name)
        {
            this.name = name;
        }
        void setAlter(int x)
        {
            peter = x;
        }
    private:
        int alter;
        string name;
    };
    
    void test()
    {
        vector<string> Namen;
        Namen.push_back("Peter");
        Namen.push_back("Hans");
        Namen.push_back("Paul");
    
        Person peter = Person(Namen[0]);
        peter.setAlter(18);
    }
    

    Und arbeite nochmal die Grundlagen durch...



  • Danke sehr, das klappt schon mal gut !
    Ich will allerdings das ganze in einer Schleife durchlaufen lassen und alle Namen aus dem vector (der in wirklichkeit natürlich sehr viel länger ist) verwenden zum erstellen von class membern. Das würde ja so nicht gehen da die Person nun als "a" deklariert ist und das nicht durchlaufen wird von der Schleife.
    Wie könnte ich das anstellen ?

    Wahrscheinlich könnte man das alles viel klüger machen, aber erstmal will ich meinen komisch erscheinenden Ideen nachgehen. Die Grundlagen muss ich wirklich durchgehen 😉



  • #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Person
    {
    public:
        Person(const string &name) : Name(name){
        }
        //Funktionen
        void setAlter(int x)
        {
            Alter = x;
        }
    
    private:
        string Name;
        int Alter;
    };
    
    int main()
    {
        vector<string> Namen = {"Peter", "Hans", "Paul"};
        vector<Person> Personen;
        for (auto &name : Namen){
            Personen.emplace_back(name);
            //tut fast dasselbe wie
            //Personen.push_back(Person(name));
        }
        Personen[0].setAlter(44);
    }
    


  • Wunderbar, das klappt ! Tolles Forum hier, schnelle kompetente Hilfe 😉

    Gruß jimbo


Log in to reply