Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler outstream in Datum

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 <
000
07.12.2004, 10:25 Uhr
~Peter82
Gast


Hallo ich hab folgende Datums-Klasse und Quellcodedatei die ich weiter in meinem Programm nutze. Nun will ich das Datum mit den anderen Daten des Programms in eine Dateien schreiben und wieder auslesen.
Aber die Methode ostream* write( ostream& os) const;
Funktioniert nicht :-( .
Kann ich das vielleicht noch besser lösen ich
vor der Stelle: " ostream* write( ostream& os) const;"
bekomm immer den Fehler: Fehlendes ';' vor * . ??


C++:

#include "Datum.h"

#include<iostream>
#include<ctime>
#include<fstream>

// Bindet den Standard Namensbereich ein
using namespace std;            



// Datum mit heutigem Datum initialisieren
void Datum::init(void)
{
    struct tm *zeit;
    time_t sec;

    time(&sec);
    zeit = localtime(&sec);

    tag = (short) zeit->tm_mday;
    monat = (short) zeit->tm_mon + 1;
    jahr = (short) zeit->tm_year + 1900;
}


// datum mit übergebenen Werten initialisieren-->
void Datum::init(int t, int m, int j)
{
    tag = (short) t;
    monat = (short) m;
    jahr = (short) j;
}


//Datum ausgeben
void Datum::print(void)
{
    cout <<tag<<"."<<monat<<"."<<jahr<<endl;

}

// Wenn es ein Schaltjahr ist
bool Datum::isLeapYear(int j){
    return(jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0; // wahr zurückgeben, wenn Bedingungen erfüllt
}


// Datum setzen
bool Datum::setDatum(short tg, short mn, short j){
    if (tg < 1 || tg > 31) return false;        // ungültiger Tag
    if (mn < 1 || mn > 12) return false;        // ungültiger Monat

    switch(mn){                                    // "Case Monat of"
    case 2: if(isLeapYear(j)){                    // Wenn Schaltjahr und Februar ist
                if (tg > 29)                    // Darf Tag nicht größert als 29 sein
                    return false;                // sonst gib falsch zurück
            }        
        else if (tg    > 28)                        // sonst darf Tag n icht größer 28 sein
            return false;                        // sonst gib falsch zurück
        break;                                    // verlasse die Anweisung
    case 4:                                        // April,
    case 6:                                        // Juni
    case 9:                                        // September
    case 11:                                    // November
            if(tg > 30) return false;            // Tag darf nicht größer 30 sein
    }
    tag = tg;                                    // Tag,
    monat = mn;                                    // Monat,
    jahr = j;                                    // Jahr intialisieren
    return true;                                // wahr zurück
}


}*/

ostream& Datum::write(ostream& os)
    {
   os.write((char*)&tag, sizeof(tag) );
   os.write((char*)&monat, sizeof(monat) );
   os.write((char*)&jahr, sizeof(jahr) );    
   return os;
    }





C++:

#ifndef _DATUM_                // Verhindert mehrfaches Inkludieren der Klasse
#define _DATUM_

#include <fstream>

class Datum                    // Definition der Datum Klasse
{
private:
    short tag, monat, jahr;    // Tag, Monat, Jahr

public:

    Datum(    short tg = 1,                        // Konstruktor
            short mn = 1,
            short j = 1900):tag(tg), monat(mn), jahr(j){}
    

    void init(void);                            // Standard Initialisierung (heutiges Datum)
    void init(int tag, int monat, int jahr);    // Initialisierung
    void print(void);                            // Ausgabe
    
    bool setDatum(short tg, short mn, short j);    // Prüft Format und legt das Datum fest
    bool isLeapYear(int jahr);                    // Prüft auf Schaltjahr
    
    short getday(){return tag;}                    // Liefert tag
    short getmonth(){return monat;}                // Liefert monat
    short getyear(){return jahr;}                // Liefert monat
    
//    void dspeichern(char* datei);
    
//    istream& read( istream& is);
    ostream* write( ostream& os) const;
    
    
};

#endif        // Ende der Klassendefinition von Datum


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.12.2004, 10:41 Uhr
(un)wissender
Niveauwart


ostream* write( ostream& os) const; //Deklaration

ostream& Datum::write(ostream& os) //Definition

Fällt dir was auf?
(Pointer vs. Referenz, const vs. non-const)
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.12.2004, 11:43 Uhr
~Th
Gast


Der eigentliche Fehler ist, daß in der Header-Datei der namespace 'std' angegeben werden muß, also


C++:
std::ostream& write( std::ostream& os) const;



In der cpp-Datei hast du ja "using namespace std;" angegeben, damit er die Deklaration für 'ostream' findet, du kannst aber auch in der Header-Datei 'using std::ostream' angeben, aber dann ist ostream in jeder Datei, die "Datum.h" einbinden, auch ohne namespace 'std' ansprechbar (kann Probleme geben, wenn man eine eigene ostream-Klasse implementiert).

Also generelle Regel:
- in Header-Dateien immer namespace separat angeben
- in Implementierungsdateien entweder "using namespace X;" oder besser einzelne "using X::A;" angeben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.12.2004, 12:49 Uhr
(un)wissender
Niveauwart


Und ja nicht im Header "using namespace std;" schreiben, um es noch einmal deutlich zu sagen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: