Brauche hilfe



  • Hallo Community,
    ich brauche hilfe bei einer Aufgabe, bin neu in der C++ Sprache

    Hier ist die Aufgabe:

    Entwerfen Sie eine Klasse Person, in der ein Name gespeichert werden kann. Intern soll der Name in einem Attribut vom Typ char*, ohne Verwendung des STL-Klassen-Templates std::string.
    Die Klasse soll nur durch den Konstruktor Person( char const *name ) instanziiert werden können.
    Definieren Sie auch einen passenden virtuellen Destruktor.
    Geben Sie im Konstruktor und Destruktor bitte zusätzlich Kontrollmeldungen aus, um das ordnungsgemäße Verhalten zu dokumentieren. (diese Ausschriften können später ausgeblendet werden)
    
    Definieren Sie zusätzlich einen public Getter mit dem Sie den gespeicherten Namen von außen unveränderbar benutzen können und eine Methode printStream(std::ostream &os) mit der Sie den Inhalt der Attribute in einen Stream schreiben können.
    Beide Methoden sollen auch auf eine konstante Instanz (z.B. const Person p;) angewendet werden können.
    Neben anderen Tests der Methoden soll folgender Algorithmus fehlerfrei abgearbeitet werden können:
    
    Person p = Person("Max");
    Person const p2 = p;
    p = p2;
    cout << p2.getName() << endl;
    
    Definieren Sie alle weiteren notwendigen Methoden!
    (In jeder Methode soll der Methodenname, der Inhalt des Attributs „name“ und die Instanz-Adresse auf der Konsole protokolliert werden. Diese Ausschriften können vor der nächsten Aufgabe ausgeblendet werden.)
    (Hinweis: Denken Sie an den operator =(Person const &person) und den Kopier-Konstruktor.)
    

    Sehe gerade da garnicht durch 😕 😕

    Danke schon mal für die Antworten im vorhinein


  • Mod

    Hallo sebl11,

    Fragen wie die deine haben kaum Aussicht auf brauchbare Antworten. Bitte lies dir den ersten Link in meiner Signatur und die als wichtig markierten Threads im Forum durch.



  • das ist mir schon klar aber seh da gerade nicht durch ich weiß nicht wo ich anfangen soll


  • Mod

    sebl11 schrieb:

    das ist mir schon klar aber seh da gerade nicht durch ich weiß nicht wo ich anfangen soll

    So schnell kannst du die Links gar nicht gelesen haben und wenn dir deren Inhalt klar wäre, dann hättest du deine Frage nicht so gestellt und würdest jetzt nicht mit einer faulen "mea culpa" Antwort* kommen.

    *: Wenn man zugibt, dass man weiß, dass man etwas falsch macht, wird es dadurch auch nicht richtiger. Eher im Gegenteil, da ein Beobachter dann von absichtlichem Fehlverhalten ausgehen muss.



  • sebl11 schrieb:

    ich weiß nicht wo ich anfangen soll

    Wie wäre es mit "Entwerfen Sie eine Klasse Person"?

    Jetzt du 🙂



  • MFK schrieb:

    sebl11 schrieb:

    ich weiß nicht wo ich anfangen soll

    Wie wäre es mit "Entwerfen Sie eine Klasse Person"?

    Jetzt du 🙂

    Denn teil hab ich jetzt:

    class Person
    {
        public:
            Person( char const *name );
            ~Person();
            double getName();
            Person(const Person p);
            Person& operator=(const Person& other);
        protected:
        private:
            double name;
    };
    

    Ist das korrekt?



  • Hmm.. warum

    double name
    

    ?
    dachte es soll

    char* name
    

    sein?


  • Mod

    Das const in Zeile 7 würde ich weglassen, der Nutzer braucht nicht zu wissen, was du mit der Kopie machst, nur dass du eine Kopie machst. Außerdem willst du sie vermutlich verändern (falls du Copy&Swap nutzt, wie man es sollte). Dafür sollte jedoch get_name const sein, laut Aufgabenstellung.

    Und natürlich noch die erwähnte Sache mit dem double, sowohl beim eigentlichen Member als auch bei get_name.

    Ansonsten schon ganz gut. Die nächsten drei Schritte:
    1. Erwähnte Fehler berichtigen
    2. Eine der Methoden schnappen und implementieren
    2a. Eventuell nochmal nachfragen, falls bei 2 Schwierigkeiten auftreten.
    3. Bei 2. fortfahren, bis alle Methoden implementiert sind.



  • Syntax_error schrieb:

    Hmm.. warum

    double name
    

    ?
    dachte es soll

    char* name
    

    sein?

    ich bin aber ausgegangen das ich double nehmen muss. weil mein prof mir gesagt hat das ich bei solchen sachen immer double nehmen muss.



  • double stellt gleitkommazahlen dar (zb. 10.0 1.3434e+123....)
    willst du einen Namen haben nimm char* name oder char name[].



  • sebl11 schrieb:

    Intern soll der Name in einem Attribut vom Typ char*, ohne Verwendung des STL-Klassen-Templates std::string.

    Wow, wie sinnvoll.

    sebl11 schrieb:

    Definieren Sie auch einen passenden virtuellen Destruktor.

    Um dann nicht von Person abzuleiten.

    sebl11 schrieb:

    und eine Methode printStream(std::ostream &os) mit der Sie den Inhalt der Attribute in einen Stream schreiben können.

    Operatorüberladung kennen wir also auch nicht.

    Glückwunsch, dein Prof ist ne Pfeife was C++ angeht.


  • Mod

    314159265358979 schrieb:

    Glückwunsch, dein Prof ist ne Pfeife was C++ angeht.

    Es ist zumindest eine technisch richtige Aufgabe. Und in den ersten Wochen kennt man vielleicht nicht sofort die Operatorüberladung. Die Aufgabe ist erstaunlich gut für das, was hier sonst kommt, bloß ein bisschen unkreativ.



  • SeppJ schrieb:

    Es ist zumindest eine technisch richtige Aufgabe.

    Und das bringt ihm jetzt was, wenn der gelernte Stil von vor 15 Jahren ist?

    SeppJ schrieb:

    Und in den ersten Wochen kennt man vielleicht nicht sofort die Operatorüberladung.

    Gut, das wäre möglich. Aber da er Klassen und virtuelle Dtoren schon kennt, bin ich davon einfach mal ausgegangen.

    SeppJ schrieb:

    Die Aufgabe ist erstaunlich gut für das, was hier sonst kommt, bloß ein bisschen unkreativ.

    Das stimmt, aber meiner Meinung nach trotzdem ziemlich schlecht.



  • 314159265358979 schrieb:

    SeppJ schrieb:

    Es ist zumindest eine technisch richtige Aufgabe.

    Und das bringt ihm jetzt was, wenn der gelernte Stil von vor 15 Jahren ist?

    Möglicherweise soll ja die Dreierregel erklärt werden. Mit std::string wird das schwierig. Die Klasse scheint jedenfalls die Basis für weitere Aufgaben zu sein.



  • Wenn er die Dreierregel lernen soll, kann man das auch anhand der Implementierung einer eigenen Stringklasse lernen. Oder ein eigener vector. Oder. Oder. Oder. Aber dafür einer Klasse, die einen String verwenden möchte, das Stringmanagement aufzuzwingen, halte ich für Unfug.


  • Mod

    314159265358979 schrieb:

    Wenn er die Dreierregel lernen soll, kann man das auch anhand der Implementierung einer eigenen Stringklasse lernen.

    Das ist eine eigene Stringklasse! Die Einschränkung, nicht std::string zu benutzen ist da drin, damit nicht irgendein Klugscheißer (z.B. du) einfach einen Wrapper um std::string schreibt.



  • Person heißt also String. Na dann ist ja alles klar. 🙄
    Übrigens: Es gibt da so ein nettes OOP-Prinzip, das besagt, dass eine Klasse nur eine Funktion erfüllen soll. Klingelts? :p



  • Pi: Schon mal dran gedacht, dass man nur sehr wenige Aufgaben während eines Semesters stellen kann? Da muss man halt einige Sachen kombinieren. Ich finde die Aufgabe ziemlich gut. War aber klar, dass du mal wieder nörgeln musst.



  • Danke erstmal für die vielen antworten 🙂

    SeppJ schrieb:

    Das const in Zeile 7 würde ich weglassen, der Nutzer braucht nicht zu wissen, was du mit der Kopie machst, nur dass du eine Kopie machst. Außerdem willst du sie vermutlich verändern (falls du Copy&Swap nutzt, wie man es sollte). Dafür sollte jedoch get_name const sein, laut Aufgabenstellung.

    Und natürlich noch die erwähnte Sache mit dem double, sowohl beim eigentlichen Member als auch bei get_name.

    Ansonsten schon ganz gut. Die nächsten drei Schritte:
    1. Erwähnte Fehler berichtigen
    2. Eine der Methoden schnappen und implementieren
    2a. Eventuell nochmal nachfragen, falls bei 2 Schwierigkeiten auftreten.
    3. Bei 2. fortfahren, bis alle Methoden implementiert sind.

    Danke ich werd es versuchen und mich dann melden wenn ich nicht weiter komme. Und das mit dem double hab ich warscheinlich falsch verstanden in der aufgabe hab es jetzt auf char * geändert.

    manni66 schrieb:

    314159265358979 schrieb:

    SeppJ schrieb:

    Es ist zumindest eine technisch richtige Aufgabe.

    Und das bringt ihm jetzt was, wenn der gelernte Stil von vor 15 Jahren ist?

    Möglicherweise soll ja die Dreierregel erklärt werden. Mit std::string wird das schwierig. Die Klasse scheint jedenfalls die Basis für weitere Aufgaben zu sein.

    Jup das Stimmt das da noch weitere Aufgaben mit dabei sind die damit was zu tun haben.

    sebl11



  • Also ich hab jetzt alles soweit abgearbeitet bloß einen Fehler hab ich das er mir die ausgabe falsch ausgibt.

    Hier die Personen.cpp mit Konstruktoren

    #include "Person.h"
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    Person::Person(char const *name)
    {
        Person::name  = new char[strlen(name)+1];
    
        strcpy(Person::name, name);
    }
    
    Person::~Person()
    {
        //dtor
    }
    
    Person::Person(const Person& other)
    {
        //ctor
    }
    
    const char* Person::getName() const
    {
        return name;
    }
    
    Person& Person::operator=(const Person &other)
    {
        delete [] name;
        Person::name = new char[strlen(other.name)+1];
        strcpy (Person::name, other.name);
        return *this;
    }
    

    Die Personen.h

    #ifndef PERSON_H
    #define PERSON_H
    
    class Person
    {
        public:
            Person( char const *name );
            ~Person();
            const char* getName() const;
            Person(const Person &p);
            Person& operator=(const Person& other);
        protected:
        private:
            char* name;
    };
    
    #endif // PERSON_H
    

    Und die main ist genauso wie auf der ersten seite.

    MFG
    sebl11


  • Mod

    Die Regel der großen Drei heißt nicht, dass du die Funktionen leer lassen sollst. Das ist ja fast noch schlimmer als ganz ohne eigene Implementierung!


Anmelden zum Antworten