Grundlagenfrage zu Konstruktoren und Objekten



  • Hey liebe Community,

    wie Ihr sicher gleich unschwer merken werdet, stehe ich gerade am Anfang meiner C++ Erfahrungen.

    Das Beispielprogramm besteht aus zwei Klassen: Oberklasse und Person. Objekte von Oberklasse sollen unter anderem als Attribut ein Objekt der Klasse Person enthalten, welches in der Methode "void erstellePerson(string name,int alter)" der Klasse Oberklasse erzeugt werden sollen.

    Ich habe Probleme den korrekten Inhalt dieser Funktion hinzuschreiben.
    Wie muss dieser aussehen?

    Vielen Dank schonmal. 🙂

    Der Quellcode:

    Oberklasse.h

    //std c++ header
    #include "Person.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    #ifndef Oberklasse_h
    #define Oberklasse_h Oberklasse_h
    
    using namespace std;
    
    class Oberklasse{
    
    public:        
          Oberklasse(string name);
    
          Person eg(string,int);
    
          void erstellePerson(string name,int alter);
    
          string getName();  
    private:   
           string name;
    };
    
    #endif
    

    Oberklasse.cpp

    #include "Oberklasse.h"
    
    #ifndef Oberklasse_cpp
    #define Oberklasse_cpp Oberklasse_cpp
    
    // Konstruktor
    Oberklasse::Oberklasse(string s){
            this -> name=s;                                                    
    }
    
    string Oberklasse::getName(){
           return this -> name;
           }
    
    // Methode erstellt ein neues Objekt der Klasse Person        
    void Oberklasse::erstellePerson(string name,int alter){
     Person eg(name,alter);                                // ?????????
     this -> eg=eg;                                        // ??????????
     // Fehlermeldung 18 invalid use of member (did you forget the `&' ?) 
    }
    
    int main(int argc, char** argv){
    
         // Erstellung einer neuen Oberklasse  o
         Oberklasse o("MeineOberklasse");
         // Erstellung eines neuen Objektes Person (Attribut des Objektes o)
         o.erstellePerson("Egon",34);
         // Ausgabe des Namens der Oberklasse 
         cout <<"Name der Oberklasse: " << o.getName() << endl; 
         // Ausgabe des Namens der Person in o
         cout <<"Name der Person: " << o -> eg.name <<endl;   //  ??????????
         // Ausgabe des Alers der Person in o
         cout << o.eg.getAlter() << endl;                     // ??????????
    
         system("pause");  
    }
    

    Person.h

    //std c++ header
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    #ifndef Person_h
    #define Person_h Person_h
    
    using namespace std;
    
    class Person{
    
    public:    
           string name;     
    
           Person(string name,int alter);
    
           void setAlter(int a);
    
           int getAlter();
    
    private: 
            int alter;
    };
    
    #endif
    

    Person.cpp

    #include "Person.h"
    
    #ifndef Person_cpp
    #define Person_cpp Person_cpp
    
    Person::Person(string name,int alter){
           this -> name=name;
           this -> alter=alter;
    }
    
    int Person::getAlter(){
        return alter;
    }
    
    void Person::setAlter(int a){
         this -> alter=a;
    }
    
    #endif
    


  • **hi,

    wie soll das gehen? deine oberklasse hat gar keinen member des typs "person", nur eine funktion "eg", die den typ "person" zurückgibt 😕
    wenn sie einen hat, dann wird deren konstruktor schon vor dem konstruktor der oberklasse aufgerufen. was du aber machen könntest ist

    class oberklasse
    {
    public:
      oberklasse(string name, int alter);
    private:
      person p;  
    }
    
    oberklasse::oberklasse( string name, int alter ):
      p(name, alter)
    {
      //wasauchimmer;
    }
    

    was aber wahrscheinlich nicht gefragt ist, da du ja hier keine methode "erstelle person" haben kannst, denn die person wird schon am anfang erstellt.

    was auch gemeint sein könnte, ist, dass du in der oberklasse einen zeiger auf eine person hast, der zunächst auf NULL, und erst nach aufruf von "erstellePerson" auf eine gültige person zeigt:

    class oberklasse
    {
    public:
      void oberklasse(){p = NULL;}
      void ~oberklasse(){ if(p) delete p;} //ganz wichtig.
    
      void erstellePerson(string name, int alter)
      {
         p = new person(name, alter);
      }
    private:
      person *p;
    };
    ```**


  • Hey gadfabelasr,

    Die zweite Antwort war genau die, die ich gesucht habe, DANKE. 🙂

    Eine Frage fällt mir jetzt noch ein. Wenn eigene Klassen Attribute von anderen Klassen sind, müssen diese dann immer als Pointer deklariert werden?

    Ich habe deine Lösung mit in meinen Quellcode eingebastelt. Er läuft jetzt so wie von mir gewünscht.

    Anhang: der korriegierte Quellcode.

    Oberklasse.h

    //std c++ header
    #include "Person.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    #ifndef Oberklasse_h
    #define Oberklasse_h Oberklasse_h
    
    using namespace std;
    
    class Oberklasse
    {
    public:
      //Konst / Dest
      Oberklasse(string name);
      ~Oberklasse();
    
       //Attribute
      string getName();
      Person *p;
    
      //Methoden
      void erstellePerson(string name, int alter);
    
    private:
       //Attribute 
      string name;
    };
    #endif
    

    Oberklasse.cpp

    #include "Oberklasse.h"
    
    #ifndef Oberklasse_cpp
    #define Oberklasse_cpp Oberklasse_cpp
    
      Oberklasse::Oberklasse(string name){
           this -> name=name;
           p = NULL;
      }
    
      Oberklasse::~Oberklasse(){
            if(p) delete p;
    
      } //ganz wichtig.
    
      void Oberklasse::erstellePerson(string name, int alter){
         p = new Person(name, alter);
      }
    
      string Oberklasse::getName(){
           return this -> name;
      }
    
      int main(int argc, char** argv){
    
         // Erstellung einer neuen Oberklasse  o
         Oberklasse o("MeineOberklasse");
         // Erstellung eines neuen Objektes Person (Attribut des Objektes o)
         o.erstellePerson("Egon",34);
         // Ausgabe des Namens der Oberklasse 
         cout <<"Name der Oberklasse: " << o.getName() << endl; 
         // Ausgabe des Namens der Person in o
         cout <<"Name der Person: " << o.p -> name <<endl;  
         // Ausgabe des Alers der Person in o
          cout <<"Alter der Person: " << o.p -> getAlter()  << endl;                  
    
         system("pause");  
    }
    

    Person.h und Person.cpp wurden nicht verändert.



  • **hi,

    Eine Frage fällt mir jetzt noch ein. Wenn eigene Klassen Attribute von anderen Klassen sind, müssen diese dann immer als Pointer deklariert werden?

    nein, du kannst sie genau so wie ints, oder sonstwas als "echte" member deklarieren. pointer brauchst du, wenn du sie unabhängig von der übergeordneten klasse erstellen/löschen willst. (wie in deinem beispiel.) :)**



  • Okay 🙂


Anmelden zum Antworten