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 <
010
19.02.2017, 10:35 Uhr
GisiNA



Hola!

El siguiente código refleja lo que intento hacer.


C++:

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

using namespace std;

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; }
};

class PatientDatenbank : protected Patient
{
   protected:
        //vector tipo clase Patient.
       vector<Patient> vielePatient;
   public:
   PatientDatenbank(){}
       //Copia del vector clase Patient
   vector<Patient> GetCopyOfVector()
   { return vielePatient; }

        // Escribir en la copia del vector
    void patInsert(vector<Patient>& vielePatient)
    {    
         vielePatient.push_back(datenbank);
         cout << endl;
    }

        // Imprimir el vector en pantalla
    void printVectorPatientDatenbank(const vector<Patient>& vielePatient)
    {
        int i;
        int size = vielePatient.size();

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

int main()
{
    string _sname, _fname;
//    Patient patient01;
   PatientDatenbank datenbank;

    cout<<"Apellido: ";
    cin >> _fname;
//    patient01.setFistname(_fname);
    datenbank.setFistname(_fname);

    cout<<"Nombre: ";
    cin >> _sname;
//    patient01.setFistname(_sname);
    datenbank.setSecondname(_sname);

    return 0;
}
}



Este programma arroja el siguiente error:

C++:
prog.cpp: In member function &#8216;void PatientDatenbank::patInsert(std::vector<Patient>&)&#8217;:
prog.cpp:45:33: error: &#8216;datenbank&#8217; was not declared in this scope
          vielePatient.push_back(datenbank);
                                 ^
prog.cpp: In function &#8216;int main()&#8217;:
prog.cpp:21:7: error: &#8216;void Patient::setFistname(std::string)&#8217; is inaccessible
  void setFistname(string _fname)
       ^
prog.cpp:71:30: error: within this context
  datenbank.setFistname(_fname);
                              ^
prog.cpp:71:30: error: &#8216;Patient&#8217; is not an accessible base of &#8216;PatientDatenbank&#8217;
prog.cpp:24:7: error: &#8216;void Patient::setSecondname(std::string)&#8217; is inaccessible
  void setSecondname(string _sname)
       ^
prog.cpp:76:32: error: within this context
  datenbank.setSecondname(_sname);
                                ^
prog.cpp:76:32: error: &#8216;Patient&#8217; is not an accessible base of &#8216;PatientDatenbank&#8217;




Es decir, no logro que el vector reconozca mi Objeto

Dieser Post wurde am 19.02.2017 um 10:39 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
19.02.2017, 15:01 Uhr
Hans
Library Walker
(Operator)



Zitat von GisiNA:
Hola!

El siguiente código refleja lo que intento hacer.

...

Este programma arroja el siguiente error:

...

Es decir, no logro que el vector reconozca mi Objeto


Häh?! - kann kein Spanisch.

scnr,
Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 19.02.2017 um 15:01 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
19.02.2017, 19:39 Uhr
ao

(Operator)


Noch einmal, Gisina: Es ist ein falscher Ansatz, PatientDatenbank von Patient abzuleiten!

Und es ist ungünstig, dass die formalen Parameter von patInsert und printVectorPatientDatenbank genauso heißen wie die Member-Variable. Dadurch verdecken sie nämlich das Member, und das führt zu Missverständnissen darüber, was der Code tut.

Mir scheint, diese Programmieraufgabe ist noch zu kompliziert für deinen Erfahrungsstand. Geh mal ein paar Kapitel zurück und mach zuerst Übungen, die weniger Verständnis erfordern.

Dieser Post wurde am 19.02.2017 um 19:40 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
20.02.2017, 17:20 Uhr
GisiNA



Mh, das ist keine Programmieraufgabe entnommen aus einem Buch oder sonst wo her. Es ist eine eigene Fragestellung. Ich bisher sehr wenig über vectors type class finden können. Wenn Du mir vielleicht sagen könntest wo ich etwas vollständigeres finden könnte, wäre ich dir dankbar.

Vielleicht kannst Du mir auch besser erklären wie man mit dieser Art von Vektoren umgeht.
Vielen Dank!

Dieser Post wurde am 20.02.2017 um 17:25 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
21.02.2017, 13:53 Uhr
GisiNA



Hallo ao!

Du sagtest: "Noch einmal, Gisina: Es ist ein falscher Ansatz, PatientDatenbank von Patient abzuleiten!"

Schau mal, ich habe zu meiner Frage mir selber die Antwort geben können, und... oh Wunder(!), es ist absolut doch möglich.

Hier lasse ich Dir den funktionierenden Code, mit ein paar Erklärungen. Ich denke, das ist ein interessantes Thema und, es stimmte wie du meinst, etwas schwer... klar... aber, wie du siehst, doch nicht unmöglich zu lösen!! Ein wenig knobeln, und hin und her probieren, und man findet die Lösung. Ich glaube die Lösung kann Dich interessieren (auch anderen) und, wie mir scheint, dein Wissen über Vektoren type Class vertiefen und erweitern...

Solltest Du fragen haben, stehe ich Dir gerne zur Verfügung!

Und hier der Code:


C++:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Patient
{
protected:
    string fname;
    string sname;

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

    // Setters und getters
    void setFistname(string _fname)
    { fname = _fname; }

    void setSecondname(string _sname)
    { sname = _sname; }

    void setName(string _fname, string _sname)
    { fname = _fname;
    sname = _sname;}

    string getSecondname() const { return sname; }
    string getFistname() const { return fname; }
};

// Die abgeleitete Klasse PatientDatabase übernimmt alles von seiner Vaterklasse
// Patient.
// Sie enthält den Vektor der die Daten von Patient speichert, die dazugehörigen Funktionen, ihren Konstruktor und ihren Destruktor.
class PatientDatabase : public Patient
{
   private:
    void privateFunktion()
    {    
        //string _sname, _fname;     // Falls man durch Tastatureingabe Vektor füllen
                                            // will.
        vector<Patient>vielePatient;
        vectorfuellen(vielePatient);
        printVector(vielePatient);
    }
   public:
    // Zum aufrufen der privaten Funktion die den Vektor enthält
    void publicFunktion()
    { privateFunktion(); };


// Funktion zum bearbeiten des Vektors
// Funktion 1: zum füllen des Vektors
    void vectorfuellen(vector<Patient>& f_vielePatient)
    {
            Patient patient01;
            Patient patient02;
            Patient patient03;
    
            patient01.setName("me", "mo");
            patient02.setName("ma", "mu");
            patient03.setName("hu", "ju");

            f_vielePatient.push_back(patient01);
            f_vielePatient.push_back(patient02);
            f_vielePatient.push_back(patient03);

    }

// Funktion 2: zum zeigen des Vektors
    void printVector(const vector<Patient>& p_vielePatient){
            for(int i=0; i<=p_vielePatient.size(); i++)
                { cout << p_vielePatient[i].getFistname() << " " << p_vielePatient[i].getSecondname() << endl; }
    }

   PatientDatabase(){}
    ~PatientDatabase(){}

};

int main()
{
    // Erstellen eines Objekts um auf PatientDatabase zugreifen zu können.
    PatientDatabase patient01;
    // Aufruf der Funktion die den Vektor enthält.
    patient01.publicFunktion();

    return 0;      
}    



Alles gute und vielen Dank für Dein bemühen!
Gisi

Dieser Post wurde am 21.02.2017 um 14:10 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
21.02.2017, 14:39 Uhr
ao

(Operator)


Es ist möglich, ja, aber es ist falsch. Nicht alles, was man kompilieren kann, ist ein sinnvolles Programm oder ein sinnvolles Design.

Eine Patientendatenbank verwaltet Patienten, aber sie ist selber kein Patient. Wäre sie ein Patient, dann könnte man mit ihr alles machen, was man auch mit einem Patienten machen kann: Ihn zum Arzt schicken, ihm ein Rezept ausstellen, ihn operieren ...

Du kannst an deiner Patienten-DB setName aufrufen und sie damit "Fritz Meier" taufen - probier es aus, in der main-Funktion, es geht. Weil die DB von Patient abgeleitet ist, kann sie alles, was auch ein Patient kann. Aber das ergibt einfach keinen Sinn, und in größeren Programmen sorgen solche Designfehler für riesige Verwirrung, das kann ich dir versichern.

Genauso ist ein Bus kein Fahrgast, auch wenn Fahrgäste drin sitzen, und ein Laden ist kein Apfel, auch nicht, wenn er Äpfel verkauft.

Nimms mir nicht übel, aber das meinte ich mit "dein Verständnis reicht wohl noch nicht".

Dieser Post wurde am 21.02.2017 um 14:39 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
21.02.2017, 19:48 Uhr
GisiNA



Der selbe Code von oben kann auch, ganz klar, in einer Klasse zusammengelegt werden. Aber, so wie er jetzt ist, denke ich, mit Verbesserungen, ist das ein guter Ansatz bei Mehrfachvererbung, der in solchen Fällen den Code übersichtlicher machen könnte.


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

using namespace std;

class Patient
{
private:
    string fname;
    string sname;

    void privateFunción()
    {    
        //string _sname, _fname;  
        vector<Patient>vielePatient;
        vectorfuellen(vielePatient);
        printVector(vielePatient);
    }

public:
    ~Patient(){}

    Patient(){ }

    // Zum aufrufen der privaten Función
    void publicFunción()
    { privateFunción(); };

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

    void setSecondname(string _sname)
    { sname = _sname; }

    void setName(string _fname, string _sname)
    { fname = _fname;
    sname = _sname;}

    string getSecondname() const { return sname; }
    string getFistname() const { return fname; }

    void vectorfuellen(vector<Patient>& f_vielePatient)
    {
            Patient patient01;
            Patient patient02;
            Patient patient03;
    
            patient01.setName("me", "mo");
            patient02.setName("ma", "mu");
            patient03.setName("hu", "ju");

            f_vielePatient.push_back(patient01);
            f_vielePatient.push_back(patient02);
            f_vielePatient.push_back(patient03);

            // Falls man durch Tastatureingabe den Vektor füllen will.
            // (Muss vieleicht etwas umgestellt werden.)
            /*cout<<"Apellido: ";
            cin >> _fname;
            //patient01.setFistname(_fname);

            cout<<"Nombre: ";
            cin >> _sname;*/

            //patient01.setSecondname(_sname);

            //patient01.setName(_fname, _sname);
    }

    void printVector(const vector<Patient>& p_vielePatient){
            for(int i=0; i<=p_vielePatient.size(); i++)
                { cout << p_vielePatient[i].getFistname() << " " << p_vielePatient[i].getSecondname() << endl; }
    }


};

int main()
{

    Patient patient01;
    patient01.publicFunción();

return 0;
}



Zudem habe ich das Gefühl, dass es Dir an Bescheidenheit fehlt. Viele Belehrungen aber wenig Beiträge.

Dieser Post wurde am 21.02.2017 um 19:49 Uhr von GisiNA editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
21.02.2017, 21:28 Uhr
ao

(Operator)


Alles klar, Gisina. Dein Code ist ein guter Ansatz für überhaupt nichts. Ich hoffe, du wirst das noch merken, bevor es ernst wird für dich als Programmierer.

Mag sein, dass es mir an Bescheidenheit fehlt, aber ich habe auch keinen Anlass dazu.

Und würdest du über das nachdenken, was ich dir schreibe, und nicht immer diesen Unsinn da wiederholen, dann würdest du sicher auch den Sinn meiner Belehrungen verstehen.

Trotzdem noch viel Spaß.
 
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: