W
wh.for schrieb:
Hallo Werner:
Danke für deine Hilfe. So wie du mir angeboten hast zu dem Code Fragen zu stellen, möchte ich dies nun nutzen.
Oh je, da habe ich mich ja wieder auf was eingelassen
Bevor ich anfange: Praktisch alle Deine Fragen betreffen die Syntax von C++. D.h. Du bist ein Newbee (hattest Du geschrieben), und dann ist selbst dies 'unscheinbare' Programm welches Du schreiben willst, eigentlich schon zu schwer für Dich.
Du solltest also zunächst ein Tutorial oder ein Buch durcharbeiten, und Dich an die Beispiele halten, die dort beschrieben sind. Achte dabei auf die Qualität - da ist recht viel Schrott im Umlauf - gut sollen u.a. die Bücher von Breymann und der C++-Primer sein. Du kannst Dich hier im Forum unter [Bücher] informieren.
wh.for schrieb:
explicit ZaehlenderDateiname( const char* name, int nr1 = 1 )
: m_nr( nr1 )
, m_name( name )
{}
Hier hast du den Konstruktor mit einem „explicit“ versehen und anschließend die Variablen (ich vermute mal es sind Variablen) m_nr und m_name angehängt. Solch eine Schreibweise und Zuweisung habe ich bisher noch nie gesehen. Wie funktioniert dies.
zwei Sachen: das 'explicit' ist ein C++-keyword welches festlegt, dass der Konstruktor nicht für eine implizite Konvertierung taugt. Wenn man das 'explicit' weglässt, so wäre z.B. dies möglich:
ZaehlenderDateiname name = "EinName";
dies könnte aber auch gar nicht erwünscht sein, und somit ein Fehler sein; deshalb das 'explicit' und der obige Ausdruck liefert einen Compile-Fehler.
mit dem ':' beginnt dann die Initialisierungsliste, dort werden die Member der Klasse initialisiert. Suche hier im Forum nach 'Initialisierungsliste'.
wh.for schrieb:
ZaehlenderDateiname& operator++()
Beim zweiten Konstruktor ist mir „& operator++()“ unklar und wo es Verwendung findet im Programm.
.. hate ich mir schon gedacht, deshalb habe ich das in Zeile 55 hingeschrieben. 'ZaehlenderDateiname&' ist die Referenz auf ein Objekt der Klasse 'ZaehlenderDateiname'. Das ist hier der Returntyp der Methode 'operator++()' - und ist das gleiche als ob Du schreibst:
int i=2;
++i; // <- hier wird der operator++ aufgerufen
wh.for schrieb:
Schreiber( const char* filename, int anzahlProDatei )
: m_filename( filename )
, m_zahlenZaehler( 0 )
, m_anzahlProDatei( anzahlProDatei )
, m_file( new std::ofstream( m_filename.get().c_str() ) )
{
assert( m_file->is_open() );
}
In der Kasse „Schreiber“ verstehe ich „m_file(new std::ofstream(m_filename.get().c_str()))“ nicht und was „assert(m_file->is_open())“ bewirkt.
ich schreibe gern alles in eine Zeile .. 'm_file( new std::ofstream( m_filename.get().c_str() ) )' steht für:
std::string filenameAsString m_filename.get(); // liefert den neuen Filenamen als std::string
const char filenameAsCharPtr = filenameAsString.c_str();
std::ofstream* filePtr = new std::ofstream( filenameAsCharPtr ); // erzeuge ein std::ofstream-Objekt auf dem Heap
m_file( filePtr ) // Pointer im Member 'm_file' merken
wh.for schrieb:
~Schreiber()
{
delete m_file; // schließt auch die Datei
}
Kommt der Destruktor beim Ende des gesamten Proramms zum Zug?
i.A. schon vorher - in diesem Fall, wenn das Objekt 'schreiber' welches in Zeile 82 erzeugt wird, den Scope verlässt, also in Zeile 86
wh.for schrieb:
*m_file << zahl << "\n";
Was macht „*m_file<<zahl<<“\n“
gibt eine Zahl 'zahl' und den Text "\n" (End Of Line) auf dem std::ostream *m_file aus. Wie würdest Du eine Zahl ausgeben?
wh.for schrieb:
// -- Kopieren verhindern; wg m_file
Schreiber( const Schreiber& );
Schreiber& operator=( const Schreiber& );
Hier würde ich vermuten das dies eine Schleife darstellt, hab aber absolut keine Ahnung?
Nein, mit einer Schleife hat das nichts zu tun - ignoriere es erst mal; es stellt sicher, dass Du nicht aus Versehen die Klasse Schreiber falsch verwendest.
Gruß
Werner