Problem mit einer Container klasse!



  • Hallo leute,

    Hab ein dickes problem mit einer Aufgabe,hoffe ihr könnt mir helfen.Bin wirklich verzweifelt,komm nicht mehr weiter!!!

    HIer die aufgabe:

    http://img114.imageshack.us/img114/8264/aufgabe3ll7.jpg

    header:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include "stdafx.h"
    
    #ifndef HEADER
    #define HEADER
    
    using namespace std;
    const int T=20;
    
    const int n=15;
    
    const int breite=12;
    
    class Knoten
    	{
    		T* item;
    		Knoten* next;
    		friend class Container; //friend class ermöglicht den direkten Zugriff auf item und next vom Container Objekt aus!
    	};
    
    	class Container
    	{
    			Knoten* head;
    			Knoten* now;
    
    		public:
    			Container( );
    			bool add(T* newItem);
    			void begin( );
    			void next( );
    			T* getitem( );
    
    	};
    	void titelleiste();
    
    class Medium {
    
    protected:    // Vererbte klassen dürfen drauf zugreifen!
    	int signatur;
    	string titel;
    	bool bstatus;
    
    public:
    	Medium();
    	void init();
    	void anzeigen();
    	void entleihen();
    	void rueckgabe();
    	int getsig();
    
    };
    
    typedef Medium T;
    
    #endif
    

    meine main:

    #include <iostream>
    #include <iomanip>
    #include <stdlib.h>
    
    #include "stdafx.h"
    #include "header.h"
    
    using namespace std;
    
    int main ()
    {
    
    	char wahl;
    
    	T *ptr;
    	list=new Container;
    
        int l=0; //zählvariable für die schleife
        int sig_suche;
    
        cout << '\t' <<'\t' << "M E D I E N V E R W A L T U N G" ;
    	while(1)
        {
    	cout<< endl<<"\tm Hinzufuegen und Initialisieren eines neuen Mediums\n"
    	    <<"\tb Hinzufuegen und Initialisieren eines neuen Buchs\n"
            <<"\tv Hinzufuegen und Initialisieren eines neuen Videos\n"   
    		<< "\tl Anzeige der Medieneigenschaften\n"
    		<< "\te Entleihen des zuletzt angelegten Mediums\n"
    		<< "\tr Rueckgabe des Zuletzt angelegten Mediums\n"
    		<< "\tq Programmende\n"
    		<< "\tEingabe:  ";
    
    	cin >> wahl;
    
    	switch (wahl)
        {
    
    		case 'm':
            case 'M':
    				Medium();
    				if (list=add (new T)==true){
    					cout << "Daten aufgenommen"<<endl;
    				}
    				else {
    				    cout <<"Aufnahme fehlgeschlage"<<endl;
    				}	
    
            case 'b':
            case 'B':
    
            case 'v':
            case 'V':        
    
    		case 'L':
    		case 'l':
    
    				for(list->begin(); list->getItem != NULL; list->next())
    				{
    				ptr = list->getItem();
    				ptr->anzeigen();
    				}   
    
    		case 'e':
            case 'E':
    
    		case 'r':
    		case 'R':
    
    		case 'q':
            case 'Q':
    
    		default:
    
    			cout<<"Geben sie bitte den passenden Buchstaben an"<<endl;
    		}// ende switch
    
    	}//gehört zu while 
    
    return 0;
    }// ende main
    

    klassen:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <stdlib.h>
    
    using namespace std;
    
    using namespace std;
    #include "stdafx.h"
    #include "header.h"
    
    Medium::Medium(){
    
    		bstatus = true;
    		cout<<'\t'<<"Bitte geben sie die Signature ein:  ";
    		cin>> signatur;
    		while(cin.fail()==true)
    		{
    			cin.clear();
    			cin.ignore(100,'\n');
    			cout<<'\t'<<"Nochmal Signature:  ";
    			cin>> signatur;
    		}
    
    		cout<<'\t'<<"Bitte geben sie den Titel ein:  ";
    
    		cin.ignore(100,'\n');
    		cin.getline(titel,T);
    		cout << endl << '\t' << "Daten erfolgreich aufgenommen." << endl;
    	}
    
    void Medium::anzeigen(){
    
    		if (bstatus==true){
    
    	cout << '\t' << setw(breite) << left << titel ;
    	cout << setw(breite) << left << "Medium";
    	cout << setw(breite) << right << signatur ; 
    	cout << setw(breite) << right << "vorh." << endl;
    		}
    	else{
    	cout << '\t' << setw(breite) << left << titel ;
    	cout << setw(breite) << left << "Medium";
    	cout << setw(breite) << right << signatur ;
    	cout << setw(breite) << right << "entl." << endl;
    	}
    
    }
    void Medium::entleihen(){
    
    		if (bstatus==true){
    			bstatus = false;
    			cout <<'\t'<<"Das Objekt " << titel << " wurde entliehen\n";
    		}
    		else{
    
    			cout <<'\t'<<"Das Objekt ist bereits entliehen\n";
    		}
    
    	}
    
    void Medium::rueckgabe(){
    
    		if(!bstatus){
    
    			bstatus = true;
    			cout <<'\t'<<"Danke"<<endl;
    		}
    
    		else{
    
    			cout<<"Rueckgabe nicht möglich da Buch nicht entliehen\n"<<endl;
    
    		}
    	}
    
    int Medium::getsig(){
    
             return signatur;
        }
    
    void titelleiste(){
    
    			cout <<endl<<'\t'<< setw(breite) << left << "Titel" ;
    			cout << setw(breite) << left << "Typ" ;
    			cout << setw(breite) << right << "Signatur" ;
    			cout << setw(breite) << right << "Status";
    			cout <<'\t'<<"------------------------------------------------------------------------"<<endl;
    	}
    
    Container::Container(){
    
    	   head = NULL;
           now = head;
    }
    
    bool Container::add(T* addItem)
    {
           Knoten * temp;
    
           temp  = new Knoten();
           temp->item = addItem;
           temp->next = head;
           head = temp;
    	   return true;
    }
    
    void Container::begin()
    {
           now = head;
    }
    
    void Container::next()
    {
    	now=now->next;
    }
    
    T* Container::getItem()
    {
           if (now != 0) 
    
    	   return now->item;
    
    	   else return NULL;
    }
    

    die fehlermeldungen:

    ------ Build started: Project: projekt2, Configuration: Debug Win32 ------
    Compiling...
    klassen.cpp
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C2143: syntax error : missing ';' before '*'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(35) : error C2061: syntax error : identifier 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C2143: syntax error : missing ';' before '*'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : warning C4183: 'getitem': missing return type; assumed to be a member function returning 'int'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(61) : error C2378: 'T' : redefinition; symbol cannot be overloaded with a typedef
            c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(11) : see declaration of 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(31) : error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'std::string' to 'char *'
            with
            [
                _Elem=char,
                _Traits=std::char_traits<char>
            ]
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(101) : error C2065: 'addItem' : undeclared identifier
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(102) : error C2448: 'Container::add' : function-style initializer appears to be a function definition
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(124) : error C2143: syntax error : missing ';' before '*'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(124) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(124) : error C2373: 'T' : redefinition; different type modifiers
            c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(11) : see declaration of 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(124) : error C2039: 'getItem' : is not a member of 'Container'
            c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(29) : see declaration of 'Container'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(125) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(126) : error C2065: 'now' : undeclared identifier
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(128) : error C2227: left of '->item' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(128) : warning C4508: 'getItem' : function should return a value; 'void' return type assumed
    c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(130) : error C2617: 'getItem' : inconsistent return statement
            c:\studium\2.semester\programmieren c++\übungen\übung 3\klassen.cpp(124) : see declaration of 'getItem'
    projekt.cpp
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C2143: syntax error : missing ';' before '*'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(35) : error C2061: syntax error : identifier 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C2143: syntax error : missing ';' before '*'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(38) : warning C4183: 'getitem': missing return type; assumed to be a member function returning 'int'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(61) : error C2378: 'T' : redefinition; symbol cannot be overloaded with a typedef
            c:\studium\2.semester\programmieren c++\übungen\übung 3\header.h(11) : see declaration of 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(20) : error C2065: 'ptr' : undeclared identifier
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(21) : error C2065: 'list' : undeclared identifier
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(46) : error C2061: syntax error : identifier 'T'
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(46) : warning C4805: '==' : unsafe mix of type ''unknown-type'' and type 'bool' in operation
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(46) : error C3861: 'add': identifier not found
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(63) : error C2227: left of '->begin' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(63) : error C2227: left of '->getItem' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(63) : error C2227: left of '->next' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(65) : error C2227: left of '->getItem' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\studium\2.semester\programmieren c++\übungen\übung 3\projekt.cpp(66) : error C2227: left of '->anzeigen' must point to class/struct/union/generic type
            type is ''unknown-type''
    Generating Code...
    Build log was saved at "file://c:\Studium\2.Semester\Programmieren C++\Übungen\Übung 3\projekt2\projekt2\Debug\BuildLog.htm"
    projekt2 - 36 error(s), 4 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    Gruß Toni



  • also ich kann dir nicht sagen, ob die Logik deines Programmes stimmt, dazu fehlt mir einfach die Zeit diesen Batzen Code durchzublättern, ein paar kleine anmerkungen, was mir spontan ins Auge fällt:

    In deiner Header schon mal:
    Z. 12, const Valtiable mit Bezeichner T wird erstellt
    const int T=20;
    Z. 23, T wird als Typ benutzt
    T* Item;
    Z. 61, hier wird T erst zum Typ gemacht, abgesehen vom Namenskonflikt
    typedef Medium T;

    In deiner main fehlen mir irgendwie ein paar Break - Anweisungen in der Switchfallunterscheidung ...



  • das hatten wir doch auch schon ..

    ok das ist 'ne Menge Code. Der erste Fehler ist einfach. Im Header steht:

    using namespace std;  // das sollte NIE in einem Header-File stehen
    const int T=20;  // <<== der Name T für eine globale (!?) Variable ist ungünstig, da T auch als Typ herhalten muss (s.u.)
    const int n=15;
    const int breite=12;
    // Du solltest globale Variablen immer vermeiden
    
    class Medium; // forward, damit der Compiler weiß, was Medium ist
    class Knoten
        {
            typedef Medium T; // siehe Aufgabenstellung und T ist leider oben schon als Varible deklariert, ändere den Namen der globalen Variable
            T* item;
            Knoten* next;
            friend class Container; //friend class ermöglicht den direkten Zugriff auf item und next vom Container Objekt aus!
        };
    

    Bem.: Auch der Knoten sollte einen Konstruktor haben; siehe Aufgabenbeschreibung.

    Übersetz es noch mal, nachdem Du den Namen der globalen Variable 'T' geändert hast (siehe <<==).

    Gruß
    Werner



  • @Werner

    Vielen danke für deine hilfe!So ein leichtsinnsfehler habe ich leider übersehen,ich werds nochmal versuchen.

    Danke nochmals

    gruß Toni



  • #include "stdafx.h" gehört nicht in eine Header-Datei!
    Weiterhin gehört #include "stdafx.h" nur in die CPP-Datei und vor alle anderen inkludes!!! Sonst gibts auch Mecker vom MSVC!

    DAs ist falsch:

    #include <iostream>
    #include <iomanip>
    #include <stdlib.h>
    
    #include "stdafx.h"    // wird der MSVC anmeckern, wenn du PCH aktiviert hast!
    #include "header.h"
    
    using namespace std;
    

    Richtig:

    #include "stdafx.h"  // gehört vor alle anderen inkludes!
    #include <iostream>
    #include <iomanip>
    #include <stdlib.h>
    
    #include "header.h"
    
    using namespace std;
    

Anmelden zum Antworten