Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » stream per Funktion zurückgeben

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
04.12.2003, 16:28 Uhr
~nAvi
Gast


Ich möchte eine Funktion schreiben die einen Stream öffnet und diesen zurückgibt.
Mein Quellcode sieht so aus

C++:
ifstream open_it(int count,char *args[])
{
ifstream txt;

if(count < 2)
    error("Keine Datei zum oeffnen angegeben!");

txt.open(args[2],ios_base::in);

if(!txt)
    error("Konnte Datei nicht oeffnen!");

return txt;
}

int main(int argc,char *argv[])
{
ifstream test;
test = open_it(argc,argv);
}


Ich bekomme aber nur einen Fehler beim Kompelieren.
Was is da falsch?
So sieht meine Fehlermeldung aus:

Compiler: Default compiler
Führt g++.exe... aus
g++.exe "Cschema\get_shape.cpp" -o "Cschema\get_shape.exe" -I"CDev-Cpp\include\c++" -I"CDev-Cpp\include\c++\mingw32" -I"CDev-Cpp\include\c++\backward" -I"CDev-Cpp\include" -L"CDev-Cpp\lib"
C:/Dev-Cpp/include/c++/bits/ios_base.h: In copy constructor
`std::basic_ios<char, std::char_traits<char> >::basic_ios(const
std::basic_ios<char, std::char_traits<char> >&':
C:/Dev-Cpp/include/c++/bits/ios_base.h:421: `std::ios_base::ios_base(const
std::ios_base&' is private
C:/schema/get_shape.cpp:33: within this context

C:/Dev-Cpp/include/c++/streambuf: In copy constructor `std::basic_filebuf<char,
std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char,
std::char_traits<char> >&':
C:/Dev-Cpp/include/c++/streambuf:486: `std::basic_streambuf<_CharT,
_Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&
[with _CharT = char, _Traits = std::char_traits<char>]' is private
C:/schema/get_shape.cpp:33: within this context

C:/Dev-Cpp/include/c++/bits/ios_base.h: In member function
`std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char,
std::char_traits<char> >::operator=(const std::basic_ios<char,
std::char_traits<char> >&':
C:/Dev-Cpp/include/c++/bits/ios_base.h:424: `std::ios_base&
std::ios_base::operator=(const std::ios_base&' is private
C:/schema/get_shape.cpp:42: within this context

C:/Dev-Cpp/include/c++/streambuf: In member function `std::basic_filebuf<char,
std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char>

>::operator=(const std::basic_filebuf<char, std::char_traits<char> >&':
C:/Dev-Cpp/include/c++/streambuf:489: `std::basic_streambuf<_CharT, _Traits>&
std::basic_streambuf<_CharT, _Traits>::operator=(const
std::basic_streambuf<_CharT, _Traits>& [with _CharT = char, _Traits =
std::char_traits<char>]' is private
C:/schema/get_shape.cpp:42: within this context

Ausführung beendet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.12.2003, 16:47 Uhr
ao

(Operator)


Dass der Copy-Konstruktor privat ist, bedeutet: Derjenige, der das definiert hat, will nicht, dass du solche Dinge machst.

Technisch gesehen kopierst du dabei ein File-Handle, und es könnte Filesysteme geben, die das nicht mögen.

Abhilfe: Die Funktion open_it umdefinieren (Beispiel stark vereinfacht und von allen Kontrollen befreit):


C++:
void open_it (ifstream & rTxt)
{
    rTxt.open ("bla.txt");
}

int main ()
{
    ifstream test;
    open_it (test);
    return 0;
}



Dadurch, dass open_it eine Referenz auf einen äußeren ifstream erhält, ist rTxt ein in-out-Parameter, d.h. die Änderungen durch rTxt.open sind außen sichtbar, und beim Transport durch den Funktionskopf wird kein Copy-Ctor aufgerufen.

ao

Dieser Post wurde am 04.12.2003 um 16:47 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2003, 17:13 Uhr
0xdeadbeef
Gott
(Operator)


Es geht dabei weniger um doppelte File-Handles als mehr um doppelte Buffer, die sich nachher beim flushen in die Haare kommen könnten. Eine gängige Vorgehensweise bei sowas ist, den stream schon vorher zu konstruieren und per Referenz mit- und zurückzugeben. Also:

C++:
std::ifstream &open_it(ifstream &s, int cnt, char *args[]) {
  s.open(args[1]); //arrays sind null-basiert
  return s;
}

int main(int argc, char *argv[]) {
  std::ifstream in;
  open_it(in, argc, argv);
}


Eigentlich interessant ist sowas aber erst bei Operatoren, weil man auf die Art sowas hinkriegt:

C++:
std::cout << a << b << c << std::endl;


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.12.2003 um 17:14 Uhr von 0xdeadbeef editiert.
 
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: