abstrakte Strukturen und STL-List



  • Guten Abend,

    ich habe 2 Probleme die ich gerne mit eurer Unterstüzung lösen möchte.

    Anliegen: 1) Ich habe eine Aufgabenstellung umgesetzt und würde gerne wissen ob ich dabei einen Fehler gemacht habe.
    Anliegen: 2) Mein zweites Anliegen resultiert aus meinem ersten Anliegen und wird weiter unten erwähnt.

    zum Erstens:

    Definieren Sie in einen Datentyp article, bestehend aus einer Bezeichnung und einem Preis.

    // arti.h
    
    struct article
    {
    	char* bezeichnung;						
    	int* preis;							
    
    	article* pred;		// Predecessor == Vorgänger - article
    	article* succ;		// Successor == Nachfolger - article
    };
    

    Definieren Sie mindestens einen weiteren Datentyp other_articles, der die Einkaufsliste eines Familienmitglieds repräsentiert.

    struct other_articles						
    {
    	article* First;		// Zeigt auf den ersten Artikel
    	article* Last;		// Zeigt auf den letzten Artikel
    };
    

    Definieren Sie ferner einen Datentyp member, der alle Daten zu einem Familienmitglied (Vorname, Alter, Einkaufsliste) halten kann.

    struct member
    {
    	char* first_name;
    	char* sex;
    
    	other_articles* buy_list;
    
    	article* pred;
    	article* succ;
    };
    

    Definieren Sie schließlich noch eine geeignete Struktur member_list zur Aufbewahrung der Daten aller Familienmitglieder.

    struct member_list
    {
    	member* First;
    	member* Last;
    };
    

    Wie man sehen kann, versuche ich diese Strukturen in einer doppelt verketteten Liste zu speichern.
    Habe ich mit dieser Deklaration den Anspruch der Aufgabe erfüllt? Ich habe bedenken ob die letzten beiden Strukturen auch wie gofrdert deklariert wurden oder ob es auch eine weitere Möglichkeit der Umsetzung gibt.

    Mein zweites Anliegen dreht sich um den Zugriff auf die Strukturen über die STL-Fuktionen, die ich im übrigen als eine enorme Vereinfachung zu schätzen gelernt habe.

    Die strukturen wurden extern global zugängig gemacht.

    extern article artikel;
    extern other_article weitere_dinge;
    extern member mitglied;
    extern member_list mitglieder_liste;
    

    Doch wie kann ich nun auf die einzelnen Elemente zugreifen?
    Momentan habe ich unwissentlich gearten und fesgestellt das dies nicht zum Ziel führt.

    list<other_article*> weitere_dinge;
    
    weitere_dinge.
    

    Kann mir wer helfend zur Hand gehen und seine Bedenken äußern?



  • Zu erstens: Ich würde etwas sparsamer mit Zeigern umgehen - statt char* lieber std::string, und int ist klein genug, um es direkt zu speichern. Außerdem würde ich die Grundklassen und die Verwaltungscontainer voneinander trennen (und Standard-Container nutzen:

    struct article
    {
      string bezeichnung;
      int preis;
    };
    
    typedef list<article> other_articles;
    

    Zu zweitens: Was willst du damit erreichen, daß du von jedem Datentyp genau eine Variable deklarierst (außer Linker-Fehlern beim Versuch, sie zu verwenden)? Definier dir deine Variablen dort, wo du sie auch benötigst.



  • Guten Tag.

    Ich danke für die Unterstützung. Aufbauend auf den Vorschlag implementierte ich eine Funktion zum hinzfügen eines Eintrages.

    // Header.Datei
    struct article
    {
      string bezeichnung;
      int preis;
    };
    
    list<article> other_articles;
    
    // cpp.datei
    
    void f(article& test, list<article>::iterator i, list<article>::iterator p)
    {
    
    	 other_articles.push_back(test);
    
    };
    
    extern void f(article& test, list<article>::iterator i, list<article>::iterator p)
    

    Versuche ein Element hinten anzufügen, bemängelt der Compiler ein bereits definiertes Ovjekt in der Class main. Obwohl wie eben geschrieben die externen Funktionen angewandt worden.



  • In Header-Dateien darfst du keine Variablen definieren (d.h. Speicherplatz dafür reservieren lassen, denn so hast du jetzt zwei Variablen mit gleichem Namen in zwei verschiedenen Übersetzungseinheiten und dann sagt der Linker: 'doppelte Definition von ...').

    Abhilfe schafft die Deklaration der Variablen in der Header-Datei:

    // articles.h
    #include <list>
    
    extern std::list<article> other_articles;
    

    'extern' bedeutet einfach, daß die Variable irgendwo anders definiert ist und der Linker sie dann finden muß.

    Und in genau einer Übersetzungseinheit (C++ Source-Datei) mußt du dann diese Variable definieren:

    // articles.cpp
    [cpp]
    #include "articles.h"
    
    std::list<article> other_articles;
    

    Da du noch ein Anfänger bist, lasse ich bei dir mal globale Variablen durchgehen, aber normalerweise sollte man sowenig globale Variablen wie möglich benutzen.
    Und auch ein "using namespace std;" solltest du nur (wenn überhaupt) in C++ Soruce-Dateien vornehmen (NIEMALS in Header-Dateien), d.h. möglichst den Namensbereich immer explizit mit angeben (z.B. std::).
    Für einen Anfänger mag das zwar noch nicht so wichtig sein (und vllt. etwas unleserlicher erscheinen), aber du wirst mir danken, wenn du irgenwann mal größere Projekte in Angriff nimmst.



  • Danke für den Hinweis und den Ratschlag. Ich werde dieses nun zukünftig mehr berücksichtigen.



  • Definieren Sie in einen Datentyp article, bestehend aus einer Bezeichnung und einem Preis.

    // arti.h
    
    struct article
    {
        char* bezeichnung;                       
        int* preis;                           
       
        article* pred;        // Predecessor == Vorgänger - article
        article* succ;        // Successor == Nachfolger - article
    };
    
    struct article
    {
        char* name;                       
        unsigned long price; // in ct (in € => double)     
        article(const char* name, unsigned long price) : name(new char[std::strlen(name) + 1]), price(price) { std::strcpy(this->name, name); }
        ~article() { delete [] name; }        
    };
    

    wäre eine denkbare Umsetzung, wobei ich unter dem, was der Aufgabenstelle geschrieben hat, eher sowas verstehe:

    typedef std::pair<std::string, unsigned long> article;
    

    ...

    Definieren Sie mindestens einen weiteren Datentyp other_articles, der die Einkaufsliste eines Familienmitglieds repräsentiert.

    typedef std::list <article> other_articles;
    

    Definieren Sie ferner einen Datentyp member, der alle Daten zu einem Familienmitglied (Vorname, Alter, Einkaufsliste) halten kann.

    struct family_member : public person, public family
    {
        std::pair<std::string, std::string> name;
        char sex;
        other_articles shopping_list;
    };
    

    ...

    Insgesamt sind die Aufgaben relativ miserabel gestellt ^^



  • Ist 'sex' jetzt das Alter?



  • Sex ist das Geschlecht. Noch nie auf deinen Perso geschaut? 😮

    Mich erstaunt eher, das ein Familienmitglied eine Familie sein soll? 😕



  • Mich erstaunt eher, das ein Familienmitglied eine Familie sein soll? 😕

    Hmm stimmt hab jetzt da eine IST-Beziehung aufgebaut, sollte eine "TEIL-VON"-Beziehung werden 😛


Anmelden zum Antworten