Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: wiedermal probleme mit dev-c++ ......

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.01.2005
    Beiträge
    8

    wiedermal probleme mit dev-c++ ......

    ääähm sorry das ich wieder so ne dev frage stelle aber ich weiss net weiter....
    also ich hab hier so nen "subba" programm code:

    Code:
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <cstdlib>
    #include <conio.h>
    #include <stdio.h>
    
    struct konstrukt
    {
     char name[20];
     char vname[20];
     char ort[20];
     char strasse[20];
     int plz;
     int hsnr;    
    };
    
    int main()
    {
        
    konstrukt adresse;
    
     cout << "Name Adresse: "<<endl;
     cin.get(adresse.name,20);
     cin.ignore();
     
     cout << "Vorname: " <<endl;
     cin.get(adresse.vname,20);
     cin.ignore();
     
     cout << "Postleizahl: " <<endl;
     cin >> adresse.plz;
     cin.ignore();
     
     cout << "Ort: "<<endl;
     cin.get(adresse.ort,20);
     cin.ignore();
     
     cout << "Strasse: "<<endl;
     cin.get(adresse.strasse,20);
     cin.ignore();
     
     cout << "Hausnummer: "<<endl;
     cin >> adresse.hsnr;
     cin.ignore();
    
     cout <<endl<<endl;
      
       cout << adresse.name <<endl; 
       cout << adresse.vname <<endl; 
       cout << adresse.plz <<endl; 
       cout << adresse.ort <<endl;     
       cout << adresse.strasse <<endl;
       cout << adresse.hsnr <<endl; 
           
    }
    ich hab einfach mal alle bibliotheken eingebunden die ich kenne.... so jetzt sagt er aber beim konpilieren. das "cout" und "cin" undeclared ist ..... binde ich jetzt noch iostream.h ein kommt ide berüchtigte fehlermeldung:

    2 D:\Dev-Cpp\include\c++\3.3.1\backward\backward_warning.h: 32 #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

    welche bibliothek ist jetzt falsc oder richtig ? fehl mir noch eine? ich weiss das iostream.h eigentlich nicht benötigt wird... aber ... ach ich weiss halt nemmer...


    fetten dank schon mal....

  2. #2
    Registrierter Benutzer
    Registriert seit
    04.01.2005
    Beiträge
    8

    hups

    ok habs schon.....

    aber nächste frage.....*g*
    wie speicher ich das jetzt in arrays?? also damit ich noch andere adressen speichernund abrufen kann....??? danke

  3. #3
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    lösch folgendes raus:
    Code:
    #include <stdlib.h>
    #include <conio.h> // für was verwendest das?
    #include <stdio.h>
    Und mach ein using namespace std; nach den includes rein oder verwende den std:: prefix für alle stl symbole (wie cin, cout, string, endl, ...)
    Und warum includierst du string, verwendest es dann aber nicht?
    Code:
    #include <string>
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    class Adresse
    {
    public:
    
    	string name;
    	string vname;
    	string ort;
    	string strasse;
    	unsigned int plz;
    	unsigned int hsnr;
    
    	Adresse()
    		: name(),
    		  vname(),
    		  ort(),
    		  strasse(),
    		  plz( 0 ),
    		  hsnr( 0 ) {}
    
    	Adresse( const string & name,
    	           const string & vname,
    	           const string & ort,
    	           const string & strasse,
    	           unsigned int plz,
    	           unsigned int hsnr )
    		: name( name ),
    		  vname( vname ),
    		  ort( ort),
    		  strasse( strasse ),
    		  plz( plz ),
    		  hsnr( hsnr ) {}
    
    	Adresse( const Adresse & a ) 
    		: name( a.name ),
    		  vname( a.vname ),
    		  ort( a.ort),
    		  strasse( a.strasse ),
    		  plz( a.plz ),
    		  hsnr( a.hsnr ) {}
    
    	Adresse & operator = ( const Adresse & a ) {
    		if( this != &a ) {
    			name = a.name;
    			vname = a.vname;
    			ort = a.ort;
    			strasse = a.strasse;
    			plz = a.plz;
    			hsnr = a.hsnr;
    		}
    		return *this;
    	}
    
    /* diese ausgaben hier sind eigentl. net passend an der stelle
       hier gehts um algem. ein/ausgabe, kann auch von ner datei kommen
       somit sollte es noch ne funktion geben, die von ner shell ließt und die auch solche ausgaben macht */
    	void read( istream & is ) {
    		cout << "name: " << flsuh;
    		getline( is, name );
    
    		cout << "vname: " << flsuh;
    		getline( is, vname );
    
    		cout << "ort: " << flsuh;
    		getline( is, ort );
    
    		cout << "strasse: " << flsuh;
    		getline( is, strasse );
    
    		cout << "plz: " << flsuh;
    		is >> plz;
    
    		cout << "hsnr: " << flsuh;
    		is >> hsnr;
    	}
    
    	void write( ostream & os ) {
    		os << name << endl
    		   << vname << endl
    		   << ort << endl
    		   << strasse << endl
    		   << plz << endl
    		   << hsnr << endl;
    	}
    };
    
    istream & operator >> ( istream & is, Adresse & a ) {
    	a.read( is );
    	return is;
    }
    	
    ostream & operator << ( ostream & os, const Adresse & a ) {
    	a.write( os );
    	return os;
    }
    
    int main( void ) {
    	Adresse         adresse;
    	list< Adresse > adressen;
    
    	while( !cin.eof() ) {
    		cin >> adresse;
    		adressen.push_back( adresse );
    	}
    	
    	for( list< Adresse >::const_iterator iter = adressen.begin(), end = adressen.end();
    	     iter != end;
    	     ++ iter ) {
    		cout << *iter;
    	}
    	
    	return 0;
    }
    Geändert von panzi (04-01-2005 um 16:51 Uhr) Grund: Bugfix
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.01.2005
    Beiträge
    8

    ??

    wüüüüääääää!!!! wie gehst du denn ab?? fetten dank das du dir so ne mühe machst aber ich schnall davon ja kaum was....*g* warum ich conio.h eingebunden habe?? ja keine ahnung ich hab alles versucht wie ich des oben schon gesagt habe... ich weiss das ich best. dei hälfte der bibliotheken ganet bracuhe....

  5. #5
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Habs noch etwas verbessert (hatte auch Fehler drinn) und Kommentare eingefügt.

    adresse.cpp:
    Code:
    #include <string>
    #include <iostream>
    #include <list>
    
    /* selber gschriebener header: */
    #include "conversions.hpp"
    
    using namespace std;
    
    /*
    Ich hab statt der struct glaich ne Klasse gmacht. Ist C++ net C. ;)
    Klassen haben viele Vorteile (schalg im netzt, z.B. aud de.wikipedia.org unter OOP nach).
    Die hier genutzten Vorteile sind aber nur das ich Methoden habe für den Zugriff.
    Also das sind Funktionen die fix an ein Objekt von Typen Adresse gebunden sind.
    
    Ein weiterer Vorteil ist das man alle möglichen operatoren für eine Klasse überladen klann.
    So kannst du z.B. eine art von Zahlen Klasse schreiben und alle Mathem. Operatoren überladen.
    Dann kannst du mit +, -, ++, --, /, *, += usw. so arbeiten, wie mit ner normalen Zahl. ;)
    
    Hier hab ich nur den << und >> operator für die Ein-/Ausgabe überladen.
    */
    class Adresse
    {
    public:
    
    	/*
    Ich hab auch den c++ String std::string verwendet.
    Der ist natürlich auch ne Klasse und hat alle notwendigen operatoren überladen (+, +=, = usw.)
    	*/
    	string name;
    	string vname;
    	string ort;
    	string strasse;
    	unsigned int plz;
    	unsigned int hsnr;
    
    /*
    Hier sind die Konstruktoren.
    Die werden Aufgerufen, wenn ein neues Objekt der Klasse angelegt wird.
    Je nach dem mit welchen Parameter (oder überhaupt mit einen) das Objekt
    angelegt wird, wird der entsprechende Konstruktor aufgerufen.
    
    Leerkonstruktor:
     */
    	Adresse()
    		: name(),
    		  vname(),
    		  ort(),
    		  strasse(),
    		  plz( 0 ),
    		  hsnr( 0 ) {}
    
    /* "normaler" Konstuktor: */
    	Adresse( const string & name,
    	         const string & vname,
    	         const string & ort,
    	         const string & strasse,
    	         unsigned int plz,
    	         unsigned int hsnr )
    		: name( name ),
    		  vname( vname ),
    		  ort( ort),
    		  strasse( strasse ),
    		  plz( plz ),
    		  hsnr( hsnr ) {}
    
    /* Copy-Konstruktor:
    
    Wird z.B. in dem Fall aufgerufen:
    Adresse adr1;
    Adresse adr2 = adr1;
    */
    	Adresse( const Adresse & a ) 
    		: name( a.name ),
    		  vname( a.vname ),
    		  ort( a.ort),
    		  strasse( a.strasse ),
    		  plz( a.plz ),
    		  hsnr( a.hsnr ) {}
    
    /* Der Zuweisungsoperator:
     
    Wird z.B. in dem Fall aufgerufen:
    Adresse adr1;
    Adresse adr2;
    
    ...
    
    adr2 = adr1;
    */
    	Adresse & operator = ( const Adresse & a ) {
    		if( this != &a ) {
    			name = a.name;
    			vname = a.vname;
    			ort = a.ort;
    			strasse = a.strasse;
    			plz = a.plz;
    			hsnr = a.hsnr;
    		}
    
    		return *this;
    	}
    
    /*
    Mit der Methode lese ich von einer Shell: 
    */
    	void prompt( istream & is = cin, ostream & os = cout, ostream & err = cerr ) {
    		string line;
    		bool input_ok = false;
    		
    		os << "name: " << flush;
    		getline( is, name );
    		trim( name );
    
    		os << "vname: " << flush;
    		getline( is, vname );
    		trim( vname );
    
    		os << "ort: " << flush;
    		getline( is, ort );
    		trim( ort );
    
    		os << "strasse: " << flush;
    		getline( is, strasse );
    		trim( strasse );
    
    		input_ok = false;
    		while( !input_ok ) {
    			os << "plz: " << flush;
    			getline( is, line );
    
    			try {
    				plz = parse_number< unsigned int >( trim( line ) );
    				input_ok = true;
    			}
    			catch( domain_error & e ) {
    				err << "*** error: " << e.what() << endl;
    			}
    		}
    
    		input_ok = false;
    		while( !input_ok ) {
    			os << "hsnr: " << flush;
    			getline( is, line );
    
    			try {
    				hsnr = parse_number< unsigned int >( trim( line ) );
    				input_ok = true;
    			}
    			catch( domain_error & e ) {
    				err << "*** error: " << e.what() << endl;
    			}
    		}
    	}
    
    /*
    Hiermit lese ich von ner Datei:
     */
    	void read( istream & is ) {
    		string line;
    		
    		/*
    		 * Die Funktion trim() hab ich auch selbst geschrieben.
    		 * Sie löscht alle fürenden und endenden Leerzeichen/Tabs/Zeilenwechsel/...
    		 * aus dem string raus.
    		 *
    		 * siehe: conversions.hpp
    		 */
    		getline( is, name );    trim( name );
    		getline( is, vname );   trim( vname );
    		getline( is, ort );     trim( ort );
    		getline( is, strasse ); trim( strasse );
    
    		/* ich versuche den input mit meiner template funktion
    		 * parse_number< unsigned int > in ein unsinged int umzuwandeln.
    		 * (siehe: conversions.hpp)
    		 *
    		 * falls das fehlschlägt wird die exception domain_error geworfen.
    		 * das fange ich mit diesem try {} catch() {} block ab, und dann
    		 * setzte ich das failbit im istream, um zu makieren, das was beim
    		 * lesen schief gelaufen ist.
    		 */
    		try {
    			getline( is, line );
    			plz = parse_number< unsigned int >( trim( line ) );
    
    			getline( is, line );
    			hsnr = parse_number< unsigned int >( trim( line ) );
    		}
    		catch( domain_error & ) {
    			is.setstate( is.rdstate() | ios_base::failbit );
    		}
    	}
    
    /*
    Und damit gebe ich so auf ne Datei aus, das ich's mit read() wieder lesen kann.
    Das const nach der Methodendeklaration bedeutet, das man diese Methode auch auf
    konstanten Objekten aufrufen kann, da ja nix im Objekt verändert wird.
    */
    	void write( ostream & os ) const {
    		os << name << endl
    		   << vname << endl
    		   << ort << endl
    		   << strasse << endl
    		   << plz << endl
    		   << hsnr << endl;
    	}
    };
    
    /* der Input-Operator */
    istream & operator >> ( istream & is, Adresse & a ) {
    	a.read( is );
    	return is;
    }
    
    /* der Output-Operator */	
    ostream & operator << ( ostream & os, const Adresse & a ) {
    	a.write( os );
    	return os;
    }
    
    int main( void ) {
    	Adresse         adresse;
    	list< Adresse > adressen;
    	string          line;
    	bool            answer_ok = false;
    	bool            do_read   = true;
    
    	while( !cin.eof() && do_read ) {
    		adresse.prompt();
    		adressen.push_back( adresse );
    
    		answer_ok = false;
    		
    		while( !answer_ok ) {
    			cout << endl
    			     << "weiter? [J/N] " << flush;
    			getline( cin, line );
    
    			trim( line );
    
    			if( toupper( line[ 0 ] ) == 'J' ) {
    				answer_ok = true;
    			}
    			else if( toupper( line[ 0 ] ) == 'N' ) {
    				do_read   = false;
    				answer_ok = true;
    			}
    		}
    		cout << endl;
    	}
    	
    	for( list< Adresse >::const_iterator iter = adressen.begin(), end = adressen.end();
    	     iter != end;
    	     ++ iter ) {
    		cout << *iter;
    	}
    	
    	return 0;
    }
    In folgender von mir verfassten headerfile sind templates verwendet. Die erklär ich jetzt aber nicht. Verwende einfach die Funktionen draus (wie ich's tat in adresse.cpp) wenn du willst. Betrachte all meinen in diesen Thread geposteten Code als BSD Lizenziert.

    conversions.hpp:
    Code:
    #ifndef CONVERSIONS_HPP__
    #define CONVERSIONS_HPP__
    
    #include <stdexcept>
    #include <cstdio>
    #include <cctype>
    
    std::string & trim( std::string & str ) {
    	std::string::size_type i   = 0;
    	std::string::size_type len = 0;
    
    	while( std::isspace( str[ i ] ) ) ++ i;
    
    	str.erase( 0, i );
    
    	len = str.size();
    
    	if( len > 0 ) {
    		i = len - 1;
    
    		// str[ 0 ] darf kein whitespace sein, sonst wär ja len == 0
    		while( i > 0 && std::isspace( str[ i ] ) ) -- i;
    
    		str.erase( i + 1 );
    	}
    	return str;
    }
    
    inline std::string trim( const std::string & str ) {
    	return trim( std::string( str ) );
    }
    
    
    inline std::string trim( const char * str ) {
    	return trim( std::string( str ) );
    }
    
    template< typename number_type >
    number_type parse_number( const char * str );
    
    template< typename number_type >
    inline number_type parse_number( const std::string & str ) {
    	return parse_number< number_type >( str.c_str() );
    }
    
    template< typename number_type >
    number_type _parse_number( const char * str, const char * fmt ) {
    	size_t      n     = 0;
    	number_type ret   = 0;
    	int         count = std::sscanf( str, fmt, &ret, &n );
    
    	if( count <= 0 || std::strlen( str ) > n )
    		throw std::domain_error( "Parameter has not a number format." );
    
    	return ret;
    }
    
    template<>
    inline int parse_number< int >( const char * str ) {
    	return _parse_number< int >( str, "%d%n" );
    }
    
    template<>
    inline short int parse_number< short int >( const char * str ) {
    	return _parse_number< short int >( str, "%hd%n" );
    }
    
    template<>
    inline long int parse_number< long int >( const char * str ) {
    	return _parse_number< long int >( str, "%ld%n" );
    }
    
    template<>
    inline long long parse_number< long long >( const char * str ) {
    	return _parse_number< long long >( str, "%lld%n" );
    }
    
    template<>
    inline unsigned int parse_number< unsigned int >( const char * str ) {
    	return _parse_number< unsigned int >( str, "%u%n" );
    }
    
    template<>
    inline unsigned short int parse_number< unsigned short int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%hu%n" );
    }
    
    template<>
    inline unsigned long int parse_number< unsigned long int >( const char * str ) {
    	return _parse_number< unsigned long int >( str, "%lu%n" );
    }
    
    template<>
    inline unsigned long long parse_number< unsigned long long >( const char * str ) {
    	return _parse_number< unsigned long long >( str, "%llu%n" );
    }
    
    template<>
    inline float parse_number< float >( const char * str ) {
    	return _parse_number< float >( str, "%f%n" );
    }
    
    template<>
    inline double parse_number< double >( const char * str ) {
    	return _parse_number< double >( str, "%lf%n" );
    }
    
    template<>
    inline long double parse_number< long double >( const char * str ) {
    	return _parse_number< long double >( str, "%llf%n" );
    }
    
    template< typename number_type >
    inline number_type parse_oct( const char * str );
    
    template< typename number_type >
    inline number_type parse_oct( const std::string & str ) {
    	return parse_oct< number_type >( str.c_str() );
    }
    
    template<>
    inline unsigned short int parse_oct< unsigned short int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%ho%n" );
    }
    
    template<>
    inline unsigned int parse_oct< unsigned int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%o%n" );
    }
    
    template<>
    inline unsigned long int parse_oct< unsigned long int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%lo%n" );
    }
    
    template<>
    inline unsigned long long parse_oct< unsigned long long >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%llo%n" );
    }
    
    template< typename number_type >
    inline number_type parse_hex( const char * str );
    
    template< typename number_type >
    inline number_type parse_hex( const std::string & str ) {
    	return parse_hex< number_type >( str.c_str() );
    }
    
    template<>
    inline unsigned short int parse_hex< unsigned short int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%hx%n" );
    }
    
    template<>
    inline unsigned int parse_hex< unsigned int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%x%n" );
    }
    
    template<>
    inline unsigned long int parse_hex< unsigned long int >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%lx%n" );
    }
    
    template<>
    inline unsigned long long parse_hex< unsigned long long >( const char * str ) {
    	return _parse_number< unsigned short int >( str, "%llx%n" );
    }
    
    #endif // CONVERSIONS_HPP__
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #6
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    @panzi
    Ich muß wie ein Spielverderber klingen, aber der Code ist überverkompliziert, redundant, und viel zu lang für das was er tut.
    Kann es sein, daß du eigentlich von C kommst?
    Allein dieses template parse_number (was dann komischerweise sscanf aufruft), dafür gibt es stringstream (damit kannst du auch hex und oct Zahlen einlesen).
    Allein von ansehen würde ich sagen, in C++ wäre der Code nur ein Drittel so lang.

  7. #7
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von wraith
    @panzi
    Ich muß wie ein Spielverderber klingen, aber der Code ist überverkompliziert, redundant, und viel zu lang für das was er tut.
    Kann es sein, daß du eigentlich von C kommst?
    Allein dieses template parse_number (was dann komischerweise sscanf aufruft), dafür gibt es stringstream (damit kannst du auch hex und oct Zahlen einlesen).
    Allein von ansehen würde ich sagen, in C++ wäre der Code nur ein Drittel so lang.
    Meinst?
    Bin ja eigentlich auch noch net ein so fortgeschrittener Programmierer, deswegen hätt ich das gerne besser erklärt, damit ich besser werde.
    Hier mal meine Meinung dazu/meine Überlegungen, warum ich das so gmacht hab:

    Was ist denn daran überkompleziert? conversions.hpp hab ich irgendwann mal progammiert, als ich erkannte, das es dafür nix g'scheites in c++ gibt. DAFÜR einen stringstream zu verwenden ist mir zu kompleziert (um dann auf lesefehler abzufragen, geschweige dann das der string IMHO zu oft, nämlich überhaupt, kopiert wird).
    Ich will ja auch keine Zahle einlesen, ich habe einen ganzen String, den ich in eine Zahl umwandeln will. Den ganzen. Wenn hinten drann noch !isdigit() Zeichen stehn, ist das ein Fehler. Und das sscanf verwend ich eben, weil ein stringstream den String kopieren würde, und das find ich unnötig.
    In boost gibts dafür denk ich lexical_cast<>, das bei einen Konvertierungsfehler auch ne exception liefert. atoi() u.d.G. liefert keine exception (wie auch, is C) und konvertiert auch wenn noch andere Zeichen dahinert stehn. Also ich finde so ne parse_number<>() (oder in Java Integer.parseInt() oder in JavaScript parseInt() oder in boost lexical_cast<>()), das bei nen Konvertierungsfehler eine exception liefert, in einer OOP sprache schon notwendig.

    Redundant? Das kann ich leider net nachvollziehn. Bitte um Erklärung. Meinst prompt() und read()? Oder was? Das es soviele überladungen für parse_number gibt, ist ja klar, da es auch so viele POD Typen in C/C++ gibt.

    Viel zu lange? Hmm, in wie fern? Hab für die Adresse gleich ne g'scheite Klasse gmacht. Man könnte das natürlich auch in ner std::map speichern, aber dann hätten alle Felder den Typ std::string, auch plz und hsnr, wenn man sich net grad einen any bzw. variant Datentyp schreibt (das wär dan etwas überkompleziert).

    Un ich komm nicht von C. Ich hab mir selbst mit hilfe von echt guten Unterlagen irgend einer deutschen FH und der Hilfe eines Freundes C++ "beigebracht" (naja, ne Art Einführungskurs). Und ging dann auf ein 2 Jähriges EDVO Kolleg, wo wir dann VB (*kotz* *würg* *brech*), Java dann C und dann noch ein wenig C++ (net mal Templates/STL!!!!!) "gelernt" haben. (in der Reihenfolge)
    Von dem her bin ich eher C++ als C programmierer, und hab auch meine Hausübungen in C möglichst objektorientiert programmiert, da es so einfach viel übersichtlicher wird. (Kann natürl. immer noch unübersichtl. programmiert sein, ist aber schon mal was gewonnen.)


    Also wie gesagt: Bin offen für jeden Tipp wie man's besser machen kann.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von panzi
    Was ist denn daran überkompleziert? [... ] In boost gibts dafür denk ich lexical_cast<>
    Ja, ist das nicht genau die Antwort.Vier Zeilen, und fertig, keine x Spezialisierungen.One-Size-Fits-All.
    Wenn du hinter der eigentlichen Zahl im String keine anderen Zeichen mehr dulden willst, dann ist es mit stringstream eine Überprüfung mehr.

    Eigentlich ist es mir ja egal, wie jemand privat seinen Code schreibt (jeder nach seinem Gusto), schlimmer finde ich aber, daß der OP eine völlig falsche Vorstellung von C++ bekommt.
    Redundant? Das kann ich leider net nachvollziehn. Bitte um Erklärung.
    Du weißt das Copy-Constructor und Assignment-Operator bei deiner Klasse überflüssig sind?Es reicht jeweils der Compiler-generierte.
    Viel zu lange? Hmm, in wie fern?
    Ebend parse_number und die vielen Überladungen, trim ist in C++ ein zweizeiler (3 Zeilen mit return), weiterhin std::algorithm verwenden.
    Alles zuammen genommen ist der Code dann mind. zwei Drittel kürzer, und lesbarer, weil er C++-Idiome verwendet.
    Un ich komm nicht von C.
    Ich weiß, das war mehr auf den Busch geklopft .

    und hab auch meine Hausübungen in C möglichst objektorientiert programmiert,
    Objektbasiert, aber das nur am Rande, zur Objektorientierung gehört Polymorphie, die du (ich nehme es an), in C nicht simuliert hast.

  9. #9
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von wraith
    Du weißt das Copy-Constructor und Assignment-Operator bei deiner Klasse überflüssig sind?Es reicht jeweils der Compiler-generierte.
    Hups, ja das stimmt. Mach ich nur immer schon autom. Stimmt, das braucht man hier net.
    Ebend parse_number und die vielen Überladungen
    Die vielen Überladungen hab ich, weil wenn ich sowas mal schreib, dann schreib ichs so das ich es auch wiederverwenden kann. Also gleich "ordentlich", so das man es in eine lib packen könnte.
    , trim ist in C++ ein zweizeiler (3 Zeilen mit return), weiterhin std::algorithm verwenden.
    Hey, wie? Das will ich wissen! Bin ich zu blöd um das gscheit zu erkennen? Wie kann man auf einfache weiße das trim() mit den in der STL vorhandenen Klassen/Funktionen machen?
    Objektbasiert, aber das nur am Rande, zur Objektorientierung gehört Polymorphie, die du (ich nehme es an), in C nicht simuliert hast.
    Das ist mir natürlich klar. Aber mann könnte auch das in C simulieren, mit ausprogramierten vtables (mit functionpointers), aber das wäre viel zu aufwendig. Deswegen hab ich ja auch möglichst objektorientiert geschrieben!
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  10. #10
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von panzi
    Hey, wie? Das will ich wissen! Bin ich zu blöd um das gscheit zu erkennen? Wie kann man auf einfache weiße das trim() mit den in der STL vorhandenen Klassen/Funktionen machen?
    Einfach liegt im Auge des Betrachters ;)
    (Achtung der Code-Tag hat bei ptr_fun ein Leerzeichen eingefügt was da nicht hingehört)
    Code:
    #include <string>
    #include <algorithm>
    #include <functional>
    #include <cctype>
    
    std::string& trim(std::string& str)
    {
        using namespace std;
        str.erase(str.begin(),find_if(str.begin(),str.end(),not1(ptr_fun((int(*)(int))isspace))));
        str.erase(find_if(str.rbegin(),str.rend(),not1(ptr_fun((int(*)(int))isspace))).base(),str.end());
        return str;
    }

  11. #11
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    cool, nur was ist das not1? find ich weder hier noch hier.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von panzi
    cool, nur was ist das not1? find ich weder hier noch hier.
    Hier ist es drin http://dinkumware.com/manuals/reader...=functio2.html (davor kommt noch eine Werbeseite, weiterklicken).
    Oder im Stroustrup nachlesen.

  13. #13
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  14. #14
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Noch was: Was macht die Methode .base() von einen InputIterator?
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  15. #15
    Registrierter Benutzer
    Registriert seit
    23.08.2004
    Beiträge
    24
    Zitat Zitat von panzi
    Noch was: Was macht die Methode .base() von einen InputIterator?
    kann reverse iterators zurueck in normale iterators konvertieren
    Don't say things that hurt others, said pussycat.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •