 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
carlox@web.de Guest
|
Posted: Sat Jun 11, 2005 10:25 am Post subject: Ein Problem mit Dateien und Streams |
|
|
Hallo allerseits,
beim Programmieren und Experimentieren mit Dateien habe ich noch ein
paar Probleme ...(vollständiges Programm siehe unten)
Vorbemerkung:
In einem anderen Thread wurde mir geraten "einen stream *niemals* per
value zu uebergeben, immer nur per Referenz".
Ich habe mir überlegt, warum das so ist:
Das Betriebssystem verwaltet die Informationen einer Datei (Länge, Ort
auf der Festplatte, usw.) an einer bestimmten Stelle im
Arbeitsspeicher. Wenn man durch call by value eine Kopie dieses
Streams machen würde, gäbe es noch eine andere Stelle im
Arbeitsspeicher, wo dieses Informationen der Daten hinkopiert würden.
Wenn man dann auf die Datei zugreifen würde, würden sämtliche Zugriffe
auf der Kopie gemacht werden und nicht auf dem Orginal.
Sind meine Überlegungen dazu richtig ?
Nun meine Probleme:
// vorher noch eine Deklaration:
fstream fs1, fs2;
1)
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
2)
// Folgende Anweisung ergibt aber den Compilerfehler:
// Operator "=" nicht definiert:
fs2=quelle.write((char *)&i, sizeof(i));
Das verstehe ich nicht. Der Operator "=" existiert doch (siehe 1)).
Außerdem: Laut Doku :
basic_ostream& write(const E *s, streamsize n);
liefert write eine Referenz auf ein Objekt der Klasse basic_ostream
basic_ostream ist aber gleichbdeutend mit ostream und
basic_fstream ist aber gleichbdeutend mit fstream und
ostream ist Oberklasse von fstream.
D.h. es wird ein Objekt der Oberklasse einem Objekt der Unterklasse
zugewiesen.
Das ist doch aber nicht erlaubt. Erlaubt ist doch nur (grob gesprochen
und vereinfacht ausgedrückt) die Zuweisung: "Oberklasse" =
"Unterklasse".
3)
// Folgende Anweisung ergibt Laufzeitfehler:
myr.write(&quelle);
Das verstehe ich überhaupt nicht:
Das von mir definierte write liefert doch nur ein Objekt vom Datentyp
fstream zurück
4)
// Folgende Anweisung ergibt Laufzeitfehler:
fs1=myr.write(&quelle);
das verstehe ich nicht: Das von mir definierte write liefert doch nur
ein Objekt vom Datentyp fstream zurück und weist es (Operator "="
existiert, suehe 1)) fs1 (auch ein Objekt vom Datentyp fstream) zu.
Warum bekomme ich dann während der Laufzeit eine Exception (Fenster
mit entsprechende Meldung) ?
// Folgende Anweisung ergibt Compilerfehler:
if(fs1)
erg=erg;
Das verstehe ich:
In fstream wurde kein Operator "()" definiert, der eine Zahlenwert
zurückgibt und deshalb vom Compiler als Bedingung ausgewertet werden
kann.
Hier das ganze Programm:
--------Programmbeginn--------
#include "stdafx.h"
#include <string>
#include <iostream> // i/o
#include <fstream> // datei i/o
using namespace std;
class MyRecord{
public:
int i;
MyRecord(int ii);
fstream write(fstream *datei);
};
MyRecord::MyRecord(int ii){
i = ii;
}
fstream MyRecord::write(fstream *datei){
return(*datei);
}
int main(){
int i = 5;
fstream quelle;
fstream fs1;
fstream fs2;
int r;
quelle.open("a:\mytestdatei2.txt",
ios::in|ios::out|ios::trunc|ios::binary);
r = quelle.good();
cout << "r=" << r << endl;
MyRecord myr(10);
// Folgende Anweisung ergibt Laufzeitfehler:
fs1=myr.write(&quelle);
// Folgende Anweisung ergibt Compilerfehler (Operator = nicht
// definiert):
fs2=quelle.write((char *)&i, sizeof(i));
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// Folgende Anweisung ergibt Laufzeitfehler:
myr.write(&quelle);
// Folgende Anweisung ergibt Compilerfehler:
if(fs1)
r=r;
quelle.close();
return(0);
}
--------Programmende--------
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Jun 13, 2005 2:28 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
[email]carlox (AT) web (DOT) de[/email] wrote:
| Quote: |
Hallo allerseits,
beim Programmieren und Experimentieren mit Dateien habe ich noch ein
paar Probleme ...(vollständiges Programm siehe unten)
Vorbemerkung:
In einem anderen Thread wurde mir geraten "einen stream *niemals* per
value zu uebergeben, immer nur per Referenz".
Ich habe mir überlegt, warum das so ist:
Das Betriebssystem verwaltet die Informationen einer Datei (Länge, Ort
auf der Festplatte, usw.) an einer bestimmten Stelle im
Arbeitsspeicher. Wenn man durch call by value eine Kopie dieses
Streams machen würde, gäbe es noch eine andere Stelle im
Arbeitsspeicher, wo dieses Informationen der Daten hinkopiert würden.
Wenn man dann auf die Datei zugreifen würde, würden sämtliche Zugriffe
auf der Kopie gemacht werden und nicht auf dem Orginal.
Sind meine Überlegungen dazu richtig ?
|
Im Prinzip ja. Jedoch ist ein wesentliches Problem viel einfacher:
Was soll denn die Bedeutung sein, wenn ein stream kopiert wird? Heist
das dann, dass auch eine Kopie der Datei gemacht wird? Wie ist das,
wenn nun die Kopie die Datei schliesst? Ist die dann auch
im Original die Datei geschlossen? Was ist wenn die Kopie schreibt,
muss das Original das bisher geschriebene beruecksichtigen oder darf es
das ueberschreiben?
Das Problem reduziert sich im wesentlichen immer auf dasselbe: Eine Datei
ist eine Resource die es nur einmal gibt, daher solltest Du die Datenstruktur
die diese Resource verwaltet auch nur einmal haben. Alles andere fuehrt ueber
kurz oder lang zu Verwicklungen.
| Quote: |
Nun meine Probleme:
// vorher noch eine Deklaration:
fstream fs1, fs2;
|
[snip Fragen]
verwende nicht fstream, sondern mach klar was du willst:
ostream oder ofstream um deutlich zu machen, dass du auf den stream schreiben willst
istream oder ifstream um deutlich zu machen, dass du von diesem stream lesen willst.
'o' wie output
'i' wie input
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Mon Jun 13, 2005 7:47 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
[email]carlox (AT) web (DOT) de[/email] wrote:
| Quote: | In einem anderen Thread wurde mir geraten "einen stream *niemals* per
value zu uebergeben, immer nur per Referenz".
Ich habe mir überlegt, warum das so ist:
Das Betriebssystem verwaltet die Informationen einer Datei (Länge, Ort
auf der Festplatte, usw.) an einer bestimmten Stelle im
Arbeitsspeicher. Wenn man durch call by value eine Kopie dieses
Streams machen würde, gäbe es noch eine andere Stelle im
Arbeitsspeicher, wo dieses Informationen der Daten hinkopiert würden.
Wenn man dann auf die Datei zugreifen würde, würden sämtliche Zugriffe
auf der Kopie gemacht werden und nicht auf dem Orginal.
Sind meine Überlegungen dazu richtig ?
|
Im Prinzip schon.
| Quote: | Nun meine Probleme:
// vorher noch eine Deklaration:
fstream fs1, fs2;
1)
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
|
Ich denke, dass ist eine Macke Deines Compilers, der das nicht
unterbindet. "Normalerweise" muss das nicht gehen.
Andre'
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Mon Jun 13, 2005 8:46 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
<carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:81fla1lv6gp8guohlpimo6i0k19ld1msjf (AT) 4ax (DOT) com...
| Quote: |
Nun meine Probleme:
// vorher noch eine Deklaration:
fstream fs1, fs2;
1)
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
|
Welcher Compiler lässt das durchgehen?
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
carlox@web.de Guest
|
Posted: Tue Jun 14, 2005 10:39 am Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
| Quote: | fstream fs1, fs2;
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
Welcher Compiler lässt das durchgehen?
MS VC++ Vers. 6.0 von Microsoft |
Ist nun der Operator = definiert oder nicht ?
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Jun 14, 2005 3:46 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
[email]carlox (AT) web (DOT) de[/email] wrote:
| Quote: | fstream fs1, fs2;
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
Welcher Compiler lässt das durchgehen?
MS VC++ Vers. 6.0 von Microsoft
Ist nun der Operator = definiert oder nicht ?
|
Nein. Das sollte daher nicht durchgehen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Tue Jun 14, 2005 3:48 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
<carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:1118745558.126605.68020 (AT) f14g2000cwb (DOT) googlegroups.com...
| Quote: | fstream fs1, fs2;
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
Welcher Compiler lässt das durchgehen?
MS VC++ Vers. 6.0 von Microsoft
|
Ah ja. Wer sonst :-)
| Quote: |
Ist nun der Operator = definiert oder nicht ?
|
Nein, operator= und copy-constructor sind beide in std::ios_base nur
deklariert, und zwar in der private-Sektion.
Man kann also portabel std-streams weder kopieren noch zuweisen.
Deshalb ist auch die Aussage von Dir, die Unterschiede zw. pass-by-value und
pass-by-reference von streams zu analysieren etwas eigenartig -
pass-by-value gibt es für std-streams schlicht und einfach nicht. Ein
ziemlich schlagkräftiges Argument, pass-by-reference zu nehmen :-)
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
carlox@web.de Guest
|
Posted: Tue Jun 14, 2005 4:32 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
| Quote: |
fstream fs1, fs2;
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
Welcher Compiler lässt das durchgehen?
MS VC++ Vers. 6.0 von Microsoft
Ist nun der Operator = definiert oder nicht ?
Nein. Das sollte daher nicht durchgehen.
Betrachte folgenden Programmausschnitt: |
....
fstream fs1;
fstream fs2;
ofstream ofs1, ofs2;
ifstream ifs1, ifs2;
// kein Fehler:
fs1=fs2;
ofs1=ofs2;
ifs1=ifs2;
// Fehler:
//ofs = fs1;
//ifs1=fs1;
....
Warum funktioniert (MS VC++ 6.0)
fs1=fs2;
ofs1=ofs2;
ifs1=ifs2;
aber _nicht_:
ofs1 = fs1;
(XXX)
Wenn der Zuweisungsoperator "=" in ofstream definert _wäre_, dann
müsste doch die Zuweisung ofs = fs funktionieren, weil die Klasse
fstream zu der das Objekt fs gehört eine Unterklasse (abgeleitete
Klasse) von der Klasse ofstream ist, zu der das Objekt ofs gehört
(kurz: "Oberklasse" = "Unterklasse" funktioniert).
Ist meine Überlegung (XXX) richtig, oder habe ich einen Denkfehler
gemacht ?
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Tue Jun 14, 2005 6:19 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
<carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:7l1ua1h8tqsmrdantasooqvs66sd2orp9p (AT) 4ax (DOT) com...
| Quote: |
fstream fs1, fs2;
// Folgende Anweisung ergibt keinen Fehler:
fs1=fs2;
// also muss der Operator "=" definiert worden sein !
Welcher Compiler lässt das durchgehen?
MS VC++ Vers. 6.0 von Microsoft
Ist nun der Operator = definiert oder nicht ?
Nein. Das sollte daher nicht durchgehen.
Betrachte folgenden Programmausschnitt:
...
fstream fs1;
fstream fs2;
ofstream ofs1, ofs2;
ifstream ifs1, ifs2;
// kein Fehler:
fs1=fs2;
ofs1=ofs2;
ifs1=ifs2;
// Fehler:
//ofs = fs1;
//ifs1=fs1;
...
Warum funktioniert (MS VC++ 6.0)
fs1=fs2;
ofs1=ofs2;
ifs1=ifs2;
aber _nicht_:
ofs1 = fs1;
(XXX)
Wenn der Zuweisungsoperator "=" in ofstream definert _wäre_, dann
müsste doch die Zuweisung ofs = fs funktionieren, weil die Klasse
fstream zu der das Objekt fs gehört eine Unterklasse (abgeleitete
Klasse) von der Klasse ofstream ist, zu der das Objekt ofs gehört
(kurz: "Oberklasse" = "Unterklasse" funktioniert).
Ist meine Überlegung (XXX) richtig, oder habe ich einen Denkfehler
gemacht ?
|
Wir reden hier über ein compiler-spezifische Erweiterung, nicht über etwas
das der C++-Standard beinhaltet.
Warum macht MSVC6.0 es so wie es die Dinge macht? Keine Ahnung - mußt Du
schon die Jungs in Redmond selber fragen. Ich weiß ja nicht einmal die
Effekte dessen, was da passiert, wie intern stream-buffer geteilt werden
etc. Wahrscheinlich verhindern sie Zuweisung von nicht-abstrakten
abgeleiteten Klassen an nicht-abstrakte Basisklassen, um die Konfusion in
Grenzen zu halten.
Aber wie gesagt - das ist MS VC6.0, nicht Standard-C++. Also bitte
vermeiden, wenn möglich - wahrscheinlich macht man sich damit nicht nur
langfristig, sondern auch kurzfristig selbst etwas Gutes.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Bieber Guest
|
Posted: Tue Jun 14, 2005 9:16 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
Thomas Koller wrote:
| Quote: | 6.0? Und du bist dir sicher du willst die STL verwenden? Afaik war das
ja noch vor dem Standard.
Ich würd mir schwer ein update auf einen _etwas_ neueren Compiler
überlegen.
|
Ich z.B. nehm ihn heute noch oft. BTW, die Implementierung der
Standardbibliothek war damals (im Gegensatz zum Compiler) nicht uebel
und schlug viele andere. Die Teilmenge STL ist auch heute noch für viele
Projekte ausreichend.
Micha
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
carlox@web.de Guest
|
Posted: Thu Jun 16, 2005 4:05 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
| Quote: | Ist nun der Operator = definiert oder nicht ?
Nein, operator= und copy-constructor sind beide in std::ios_base nur
deklariert, und zwar in der private-Sektion.
Man kann also portabel std-streams weder kopieren noch zuweisen.
Deshalb ist auch die Aussage von Dir, die Unterschiede zw. pass-by-value und
pass-by-reference von streams zu analysieren etwas eigenartig -
pass-by-value gibt es für std-streams schlicht und einfach nicht.
1) |
Warum wird es dann bei mir fehlerfrei compiliert und gelinkt ?
Ist dies auch ein Fehler von MS VC++ 6.0 ?
2)
Ich habe folgende eigene Version meines "Zuweisungsoperators"
implementiert:
A A::operator = (A aa);
x = aa.y;
y = aa.x;
return(*this);
};
Wenn ich nun mache:
A a;
A b;
a = b;
dann wird dieser von mir kreierte "Zuweisungsoperator" aufgerufen,
obwohl bei der Definition des Zuweisungsoperators verlangt wird:
A A::operator = (const A &aa){
x = aa.y;
y = aa.x;
return(*this);
};
Ist das wieder ein Fehler von MS VC++ 6.0 ?
3)
Wenn ich dagegen statt des Kopierkonstruktor
MyKlasse::MyKlasse(const MyKlasse &m);
"meine" folgende eigene Version des Kopierkonstruktors kreiere
MyKlasse::MyKlasse(MyKlasse *m);
wird diese richtigerweise beim Initialisieren oder bei der
Parameterübergabe nicht aufgerufen.
4)
Warum wird bei 2) meine Version des "Zuweisungsoperators" aufgerufen
und bei 3) meine Version des "Kopierkonstruktors" nicht aufgerufen ?
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
carlox@web.de Guest
|
Posted: Thu Jun 16, 2005 4:05 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
| Quote: | [snip Fragen]
verwende nicht fstream, sondern mach klar was du willst:
ostream oder ofstream um deutlich zu machen, dass du auf den stream schreiben willst
istream oder ifstream um deutlich zu machen, dass du von diesem stream lesen willst.
'o' wie output
'i' wie input
Ich will dich nicht nerven, aber mir ist folgendes nicht klar: |
1)
a) Ich habe darauf noch nie geachtet (in dem Buch "Aupperle VC++" das
ich benutze, wurde dies auch nicht beachtet). Ich habe bisher immer
nur mit fstream gearbeitet und habe noch nie Probleme bekommen.
Warum empfiehlst du Dateien, die man _nur_ liest, mit ifstream und
Dateien, in die man _nur_ schreibt mit ofstream zu öffen? Ich vermute
aus Gründen der Sicherheit: weil man in mit ofstream geöffnete Dateien
nicht auslesen und man in mit ifstream geöffneten Dateien nicht
schreiben kann, oder ?
b) Wo gibt es Probleme, wenn ich mit fstream arbeite ?
2)
Aber was machst du, wenn du in eine Datei schreiben _und_ aus der
_gleichen_ Datei lesen willst ?
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
carlox@web.de Guest
|
Posted: Thu Jun 16, 2005 4:05 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
| Quote: |
Wir reden hier über ein compiler-spezifische Erweiterung, nicht über etwas
das der C++-Standard beinhaltet.
Warum macht MSVC6.0 es so wie es die Dinge macht? Keine Ahnung - mußt Du
schon die Jungs in Redmond selber fragen. Ich weiß ja nicht einmal die
Effekte dessen, was da passiert, wie intern stream-buffer geteilt werden
etc. Wahrscheinlich verhindern sie Zuweisung von nicht-abstrakten
abgeleiteten Klassen an nicht-abstrakte Basisklassen, um die Konfusion in
Grenzen zu halten.
Aber wie gesagt - das ist MS VC6.0, nicht Standard-C++. Also bitte
vermeiden, wenn möglich - wahrscheinlich macht man sich damit nicht nur
langfristig, sondern auch kurzfristig selbst etwas Gutes.
ok, aber: |
Es geht mir nicht um MS-Eigenheiten, sondern darum ob ich etwas
richtig verstanden habe.
Ich ändere meine Aussage zu:
(XXX)
Voraussetzungen:
OK sei Oberklasse von UK
OK ok1;
UK uk1;
Behauptung:
Wenn der Zuweisungsoperator "=" in der Oberklasse OK definert _wäre_,
dann
müsste doch die Zuweisung ok1 = uk1 funktionieren, weil die Klasse
UK zu der das Objekt uk1 gehört eine Unterklasse (abgeleitete
Klasse) von der Klasse OK ist, zu der das Objekt ok1 gehört
(kurz: "Oberklasse" = "Unterklasse" funktioniert).
Ist meine Überlegung (XXX) richtig, oder habe ich einen Denkfehler
gemacht ?
mfg
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Thu Jun 16, 2005 5:12 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
<carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:2r83b1heaq3btkp5blj0vf5hfaehqlina3 (AT) 4ax (DOT) com...
| Quote: |
Wir reden hier über ein compiler-spezifische Erweiterung, nicht über
etwas
das der C++-Standard beinhaltet.
Warum macht MSVC6.0 es so wie es die Dinge macht? Keine Ahnung - mußt Du
schon die Jungs in Redmond selber fragen. Ich weiß ja nicht einmal die
Effekte dessen, was da passiert, wie intern stream-buffer geteilt werden
etc. Wahrscheinlich verhindern sie Zuweisung von nicht-abstrakten
abgeleiteten Klassen an nicht-abstrakte Basisklassen, um die Konfusion in
Grenzen zu halten.
Aber wie gesagt - das ist MS VC6.0, nicht Standard-C++. Also bitte
vermeiden, wenn möglich - wahrscheinlich macht man sich damit nicht nur
langfristig, sondern auch kurzfristig selbst etwas Gutes.
ok, aber:
Es geht mir nicht um MS-Eigenheiten, sondern darum ob ich etwas
richtig verstanden habe.
Ich ändere meine Aussage zu:
(XXX)
Voraussetzungen:
OK sei Oberklasse von UK
OK ok1;
UK uk1;
Behauptung:
Wenn der Zuweisungsoperator "=" in der Oberklasse OK definert _wäre_,
dann
müsste doch die Zuweisung ok1 = uk1 funktionieren, weil die Klasse
UK zu der das Objekt uk1 gehört eine Unterklasse (abgeleitete
Klasse) von der Klasse OK ist, zu der das Objekt ok1 gehört
(kurz: "Oberklasse" = "Unterklasse" funktioniert).
Ist meine Überlegung (XXX) richtig, oder habe ich einen Denkfehler
gemacht ?
|
Die Überlegung ist richtig, aber im konkreten Beispiel irrelevant da fstream
weder von ofstream noch von ifstream erbt!
Folgendes Programm enthält keinen operator= und ist dennoch fehlerhaft:
#include <fstream>
void Foo(std::ofstream &){}
int main()
{
std::fstream file("dat.txt");
Foo(file);
}
weil ein fstream kein ofstream ist, sondern nur ein iostream. Man kann
streiten ob das gutes design ist oder nicht (meiner Meinung ist es kein
gutes Design - wie so einiges), aber so sind die Dinge nun mal !
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Thu Jun 16, 2005 5:17 pm Post subject: Re: Ein Problem mit Dateien und Streams |
|
|
<carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:rq83b1hjqvlmve18jce02q3b2u2umavrkg (AT) 4ax (DOT) com...
| Quote: | Ist nun der Operator = definiert oder nicht ?
Nein, operator= und copy-constructor sind beide in std::ios_base nur
deklariert, und zwar in der private-Sektion.
Man kann also portabel std-streams weder kopieren noch zuweisen.
Deshalb ist auch die Aussage von Dir, die Unterschiede zw. pass-by-value
und
pass-by-reference von streams zu analysieren etwas eigenartig -
pass-by-value gibt es für std-streams schlicht und einfach nicht.
1)
Warum wird es dann bei mir fehlerfrei compiliert und gelinkt ?
Ist dies auch ein Fehler von MS VC++ 6.0 ?
|
Ja, bzw. wie es MS wohl ausdrücken würde eine "compilerspezifische
Erweiterung".
| Quote: |
2)
Ich habe folgende eigene Version meines "Zuweisungsoperators"
implementiert:
A A::operator = (A aa);
x = aa.y;
y = aa.x;
return(*this);
};
Wenn ich nun mache:
A a;
A b;
a = b;
dann wird dieser von mir kreierte "Zuweisungsoperator" aufgerufen,
obwohl bei der Definition des Zuweisungsoperators verlangt wird:
|
Verlangt wer ?
| Quote: | A A::operator = (const A &aa){
x = aa.y;
y = aa.x;
return(*this);
};
Ist das wieder ein Fehler von MS VC++ 6.0 ?
3)
Wenn ich dagegen statt des Kopierkonstruktor
MyKlasse::MyKlasse(const MyKlasse &m);
"meine" folgende eigene Version des Kopierkonstruktors kreiere
MyKlasse::MyKlasse(MyKlasse *m);
wird diese richtigerweise beim Initialisieren oder bei der
Parameterübergabe nicht aufgerufen.
|
Das * gehört weg, oder?
Ja, korrekt, für den Kopierkonstruktor braucht man als Parameter eine
Referenz. Beim asssignment-operator nicht (obwohl sich da natürlich oftmals
eine gehört !)
| Quote: |
4)
Warum wird bei 2) meine Version des "Zuweisungsoperators" aufgerufen
und bei 3) meine Version des "Kopierkonstruktors" nicht aufgerufen ?
|
Weil das eine ein Zuweisungsoperator ist, das andere aber kein
Kopierkonstruktor.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|