Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Grundlagenproblem zu Konstruktoren und Methoden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.03.2006, 15:09 Uhr
CoolFire



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

C++:
//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

C++:
#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

C++:
//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

C++:
#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

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.03.2006, 16:57 Uhr
CoolFire



Habe mein Problem mit Hilfe von gadfabelasr gelöst.


Zitat von gadfabelasr:
hi,

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

C++:
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:


C++:
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;
};






Meine Antwort:



Zitat von Cool_Fire:
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

C++:
//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

C++:
#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.

Dieser Post wurde am 24.03.2006 um 16:58 Uhr von CoolFire editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: