Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++ OOP, vector einer clase erstellen und ausgeben

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 < [ 2 ]
000
15.02.2017, 15:58 Uhr
GisiNA



Hallo Ihr lieben,

gibt es zwischen Euch jemanden der mir mit folgendem Problem weiterhelfen kann.

Folgendes Programm besteht aus zwei Klassen, einer Basisklasse Person und einer abgeleiteten Klasse Patient. Patient möchte die Daten in Person in einem Class-vector vector<Person> übernehmen.

Die main-Funktion erstellt ein neues Objekt Patient. Dieser soll dann im Bildschirm ausgegeben werden.

Leider, auch nach vielen suche, haben ich nicht finden können wie die Übergabe richtig gemacht wird.

Hier der Code:



C++:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Person
{
    protected:
        string fname;
        string sname;
    public:
        Person(){fname = ' '; sname = ' ';}
        ~Person(){}
};

class Patient
{
    protected:
        vector<Person> pDB;
        //int age;
    public:
    Patient(){}
    ~Patient(){}

    // Agrega el/los objetos creados al vector de la clase Person.
    // Toma el vector por referencia para evitar duplicados.
    void patInsert(vector<Person>& pDB)
    {    
         pDB.push_back(pDB);
         cout << endl;
    }

    // Imprime el resultado. Capta al vector de forma const
    // para evitar modificaciones del vector.
    void printVectorPatient(const vector<Person>& pDB)
    {
        int i;
        int size = pDB.size();

        for(i=0; i<size; i++)
        {
            cout << "Name Patient: " << pDB[i] << endl;
        }
    }
};

int main()
{
    // Crea un nuevo objeto.
    Patient PatDB("ma", "mo");
    PatDB.patInsert(PatDB);
    PatDB.printVectorPatient(PatDB);

    return 0;
}





Sehr vielen Dank für Eure Hilfe,
Gisi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2017, 16:43 Uhr
ao

(Operator)



Zitat:
Folgendes Programm besteht aus zwei Klassen, einer Basisklasse Person und einer abgeleiteten Klasse Patient. Patient möchte die Daten in Person in einem Class-vector vector<Person> übernehmen.

Tut mir leid, aber der Code ist ein totales Durcheinander.

1. Die Idee, Patient von Person abzuleiten, ist wahrscheinlich sinnvoll: Ein Patient ist eine Person (mit Namen usw.). Das wird aber nirgendwo gemacht. Es müsste heißen:

C++:
class Patient : public Person
{
// ....
};



2. Ich verstehe nicht, wozu der Patient einen Vector von Personen braucht. Kannst du das erklären? Der Main-Code lässt vermuten, dass es um eine Patienten-Datenbank geht (PatDB). Die Datenbank dürfte dann aber nicht vom Typ Patient sein. Das Design scheint mir irgendwie schräg zu sein.

3. Kannst du die Aufgabenstellung posten? In Deutsch oder Englisch bitte, die Kommentarsprache (Spanisch? Portugiesisch?) verstehe ich nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.02.2017, 18:50 Uhr
GisiNA



Es tu mir Leid, aber ich habe den Code versehentlich abgeschickt, und konnte es im Nachhinein nicht mehr editieren. Zu diesem Code gibt es keine Aufgabestellung.

Es ist ein eigener Versuch einen Vector typ Klasse zu erstellen, der die Werte der Basisklasse enthält. Es wäre somit eine Art Datenbank.


C++:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Person
{
    protected:
        string fname;
        string sname;
    public:
        Person(){fname = ' '; sname = ' ';}
        ~Person(){}

// Get und Sets von fname und sname
        void setNachname(string names)
        {    sname = names; }
       void setNachname(string namef)
        {    fname = namef; }

        string getVorname() const { return fname; }
        string getVorname() const { return sname; }


};

class Patient : protected Person
{
    protected:
        vector<Person> pDB;

    public:
    Patient(){}
    ~Patient(){}

// Soll eine Kopie des Vectors erstellt werden, um auf ihn zugreifen zu können?
    vector<Person> GetCopyOfVector()
    { return pDB; }

    // Füllt den Vector typ Klasse
    void patInsert(vector<Person>& pDB)
    {    
         pDB.push_back(pDB);
         cout << endl;
    }

    // Zeigt den Inhalt des Vector typ Klasse auf dem Bildschirm
    void printVectorPatient(const vector<Person>& pDB)
    {
        int i;
        int size = pDB.size();

        for(i=0; i<size; i++)
        {
            cout << "Name Patient: " << pDB[i] << endl;
        }
    }
};

int main()
{
    // Ein neues Objekt wird erstellt
    Patient PatDB("ma", "mo");
    PatDB.patInsert(PatDB);
    PatDB.printVectorPatient(PatDB);

    return 0;
}



Dieser Post wurde am 15.02.2017 um 19:14 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.02.2017, 10:54 Uhr
ao

(Operator)



Zitat von GisiNA:
Es ist ein eigener Versuch einen Vector typ Klasse zu erstellen, der die Werte der Basisklasse enthält. Es wäre somit eine Art Datenbank.

OK. Aber es ist ein sinnloses Beispiel, deshalb kann ich keine sinnvollen Ratschläge geben.

Ein Patient, der von Person abgeleitet ist (also eine Person mit besonderen Eigenschaften ist), kann nicht sinnvollerweise einen Vector von Personen enthalten. Was soll denn das bedeuten? Ein Patient besteht aus Personen?

Und eine Datenbank, die den Vector sinnvollerweise enthalten kann, kann nicht von Person abgeleitet sein. Eine DB ist keine Person. Wäre sie eine, dann hätte sie einen Namen, ein Geburtsdatum, eine Körpergröße, ein Gewicht und diverse andere Eigenschaften.

Du brauchst vermutlich drei Klassen: Person, Patient und Patientendatenbank. Wobei für die Vector-Übung die Basisklasse Person nicht unbedingt gebraucht wird, man könnte alle Eigenschaften (Namen usw.) auch direkt in Patient hineindefinieren.

Dieser Post wurde am 16.02.2017 um 10:59 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.02.2017, 16:28 Uhr
GisiNA



Hallo!

Vielen Dank!
Nur ändert die Namenänderung an mein Anliegen nicht viel.

Ich kann gerne Patient in DatenbankPatient umändern. Und Person in Patient.

Meine Frage geht nicht so sehr darum wie die Zuordnung zwischen den Klassen dargestellt werden kann, da es sich um ein Experiment handelt, sonder nur darum wie man in einem <b>Klassenvector</b>, d.h. <b>vector<NameKlasse> nameVector</b> die Daten der Elternklasse einlegt, damit dieser Vector alle notwendigen Daten speichert um ein, sagen wir mal, "End"-Objekt, in diesem Fall "Patient" erstellen kann und die dann abgerufen werden können. Ob nun die Klasse die den Vector beinhaltet, Patient oder DatenbankPatient heißt, ist wahrhaftig gleichgültig.

Das ist ein ganz interessantes Thema, aber leider gibt es kaum etwas zu finden. Deshalb suche ich hier Hilfe.

Kennst du dich mit Klassenvectoren aus?
Warum geht dieser Code schief?

Ich lege hier einen neuen Code ein der die von dir vorgeschlagenen Namensänderung der Klassen beinhaltet, damit die Idee dieses Experimentes ersichtlicher ist. Oder das hoffe ich zumindest.


C++:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Patient
{
    protected:
        string fname;
        string sname;
    public:
        //   Patient(){fname = ' '; sname = ' ';}
        ~Patient(){}

        Patient(string names, string namef)
         {     sname = names;
            fname = namef; }


        void setNachname(string names)
        {    sname = names; }

        void setVorname(string namef)
        {    fname = namef; }

        string getVorname() const { return fname; }
        string getNachname() const { return sname; }

};

class PatientDatenbank : protected Patient
{
    protected:
        vector<Patient> patient;
    public:
    PatientDatenbank(){}
    ~PatientDatenbank(){}

    vector<Patient> GetCopyOfVector()
    { return patient; }

    void patInsert(vector<Patient>& patient)
    {    
         patient.push_back(patient);
         cout << endl;
    }

    void printVectorPatientDatenbank(const vector<Patient>& patient)
    {
        int i;
        int size = patient.size();

        for(i=0; i<size; i++)
        {
            icout << "Name PatientDatenbank: " << patient[i] << endl;
        }
    }
};

int main()
{
    // Crea un nuevo objeto.
    PatientDatenbank patientDB01("ma", "mo");
    //PatDB.patInsert(PatDB);
    //PatDB.printVectorPatientDatenbank(PatDB);

    return 0;
}



Dieser Post wurde am 16.02.2017 um 16:29 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.02.2017, 19:15 Uhr
ao

(Operator)


OK, dann waren wir durch den Satz im ersten Beitrag "Folgendes Programm besteht aus zwei Klassen, einer Basisklasse Person und einer abgeleiteten Klasse Patient." auf einer ganz falschen Spur.

Es geht nur um die Beziehungen zwischen Patient und Datenbank. Hier DARF es keine Ableitung geben, weil eine Ableitungsbeziehung ausdrückt "Eine Patientendatenbank IST EIN Patient", und das ist nicht der Fall. Die Ableitung ": protected Patient" muss also wieder weg, dann musst du noch ein paar Sachen anpassen (Konstruktor von Patient mit Name und Vorname, PatientDatenbank::patInsert nimmt einen einzelnen Patienten und keinen vector) und dann kannst du eine main nach folgendem Muster machen:


C++:
int main()
{
    PatientDatenbank datenbank;

    Patient meier ("Willi", "Meier");
    datenbank.patInsert (meier);

    Patient schulz ("Hilde", "Schulz");
    datenbank.patInsert (schulz);

    datenbank.print ();

    return 0;
}



Warum hattest du eigentlich protected abgeleitet und nicht public, wie es üblich ist?

Dieser Post wurde am 16.02.2017 um 19:16 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.02.2017, 20:33 Uhr
GisiNA



Hallo!

Vielen Dank!

Mhh.. Was du mir vorschlägst kenne ich gut. Ist aber nicht was ich erreichen will.
Kennst du dich mit Klassenvectoren aus?
Es geht mir um die Erstellung eines Klassenvectors, und wie man damit umgeht.

Vielen Dank,
Gisi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.02.2017, 11:40 Uhr
ao

(Operator)


Wenn du mit "Klassenvector" dieses vector<Patient> patient meinst: Das ist natürlich in PatientenDatenbank enthalten und wird mit patInsert gefüllt und print ausgegeben. Im Prinzip so, wie du es gemacht hast, du musst nur noch ein paar Fehler korrigieren.

Wenn du was anderes meinst: Was genau?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.02.2017, 18:11 Uhr
GisiNA



Aja!

Doch, das geht schon in die richtige Richtung.

Dann wäre meine Frage, was zu korrigieren wäre, denn ich schaffe es nicht einen direkten Zugriff auf die private Variablen der Klasse Patient zu erstellen.

Das ist bisher der einzige funktionierender Code den ich bisher habe aufbauen können, und bei dem liegt der Vector in main und die Variablen sind Public. Und genau diesen Zugriff den ich durch


C++:
  Patient a;
    //Objekt an das Ende des Vektors anfügen
    cout<<"Nachname: ";
    cin>>a.sname;
    cout<<"Vorname: ";
     cin>>a.fname;



...erreiche, gelingt mir jetzt nicht.
Das ist nun der vollständig funktionierende Code.

C++:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

//Klasse einrichten
class Patient
{
    //Eigenschaften
public:
    string sname;
    string fname;

};

void vectorfuellen(vector<Patient>& vielePatient)
{
    //Objekt der Klasse anlegen    
     Patient a;
    //Objekt an das Ende des Vektors anfügen
    cout<<"Nachname: ";
    cin>>a.sname;
      cin.clear();
    cout<<"Vorname: ";
     cin>>a.fname;
      cin.clear();
    //Objekt an das Ende des Vektors anfügen
    vielePatient.push_back(a);

    //Iterator einrichten
    //vector<Patient>::iterator pos;
    //Ausgabe mittel Iterators
    /*for(pos=vielePatient.begin();pos!=vielePatient.end();++pos)
    {
        cout<<pos->fname<<' '<<pos->sname<<endl;
    }*/


     for(int i=0; i<=vielePatient.size(); i++)
     {     cout << vielePatient[i].fname << " " << vielePatient[i].sname << endl;
       }
}

int main()
{
    //Vektor von Objekten anlegen
    vector<Patient>vielePatient;
     vectorfuellen(vielePatient);

    return 0;
}


Vielen Dank,
Gisi

Dieser Post wurde am 17.02.2017 um 18:59 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.02.2017, 21:49 Uhr
GisiNA



Oh! Ich bin weitergekommen.
Das ist mein zweiter funktionierender Code mit variablen in private und dem Vector in main:


C++:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

//Klasse einrichten
class Patient
{
private:
    string fname;
    string sname;

public:
    ~Patient(){}

    Patient(){ }

    void setFistname(string _fname)
    { fname = _fname; }

    void setSecondname(string _sname)
    { sname = _sname; }
    
    string getSecondname() const { return sname; }
    string getFistname() const { return fname; }
};

int main()
{
    string _sname, _fname;

    vector<Patient>vielePatient;
    Patient a;

    cout<<"Apellido: ";
    cin >> _fname;
    a.setFistname(_fname);

    cout<<"Nombre: ";
    cin >> _sname;
    a.setSecondname(_sname);

    vielePatient.push_back(a);

    for(int i=0; i<=vielePatient.size(); i++)
    {
        cout << vielePatient[i].getFistname() << " " << vielePatient[i].getSecondname() << endl;
    }

    return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: