Forum: PC-Programmierung Klassen in funktionen nutzen c++


von SiO2 (Gast)


Lesenswert?

Wie kann ich in einer eigenen Funktion auf Funktionen einer klasse
zugreifen, von der ich ein Objekt in der main() angelegt habe?
Mit zeigern auf das Objekt hab ich probleme. ich weiss nicht wie ich
die funktion definieren muss.
fkt(ifstream *zeiger) gehts nich.

danke

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

In Main:
ifstream *fs = new ...
fkt( fs );
oder
ifstream if(..);
fkt( &if );

Funktion:
fkt( ifstream* fs ) ...
fs->FunktionInKlasse(...

Desweiteren empfehle ich ein beliebiges C++-Buch/Tutorial
z.b: http://www.cplusplus.com/doc/tutorial/

von Ulrich (Gast)


Lesenswert?

Ich würde keine Zeiger übergeben sondern direkt die Objekte und dann mit
referenzen arbeiten....

von SiO2 (Gast)


Lesenswert?

@Tobi. Danke, ich werds heut mal testen.

@Ulrich. Könntest du mir Bitte mal nen bsp.Code Posten. Auf die Idee
bin ich auch schon gekommen, aber man muss doch afaik, immer den typ
angeben, welcher übergeben wird, und das hab ich nicht hinbekommen.

von Karl heinz B. (kbucheg)


Lesenswert?

zeig doch mal an einem konkreten, möglichst kompletten,
möglichst kleinem Beispiel, was du nicht hinbekommen hast.
Dann könnten wir Dir helfen, Deine Sprachprobleme zu lösen.

von Rolf Magnus (Gast)


Lesenswert?

> @Ulrich. Könntest du mir Bitte mal nen bsp.Code Posten. Auf die
> Idee bin ich auch schon gekommen, aber man muss doch afaik, immer
> den typ angeben, welcher übergeben wird, und das hab ich nicht
> hinbekommen.

Das mußt du doch bei Zeigern auch.

> fkt(ifstream *zeiger) gehts nich.

Da fehlt ein Rückgabetyp.

von SiO2 (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang mal der Code (bitte nicht über goto meckern ;) )
Dies ist die Fehlermeldung die kommt (zeile 66 ist die Zeile
derFunktion printx() )

hiv.cpp: In function `void printx(std::ifstream*)':
hiv.cpp:66: warning: cannot pass objects of non-POD type `class
std::streampos' through `...'; call will abort at runtime

Ich hab auch verschiedene andre sachen probiert, aber immer wieder
Fehlermeldungen. Ich bin mir sicher, das es nur ein winziger Fehler
ist, aber welcher?
Auch der Zugriff FileObject->tellg() liefert -1, seit ich mit nem
Zeiger auf das Objekt artbeite, vorher mit
ifstream FileObject;
FileObject.tellg();
lief es richtig.


@Rolf: wozu brauche ich nen Rückgabewert? Ich arbeite doch mit nem
Zeiger auf das Objekt.


Danke SiO2

von SiO2 (Gast)


Lesenswert?

Upps, hab noch vergessen, Die Meldung kommt von GCC unter GNU/LINUX

von SiO2 (Gast)


Lesenswert?

Hmm.Bin schon etwas weitergekommen. Mit Borland unter w2k  läufts,
obwohls dergleiche Code ist. arghh

von Karl heinz B. (kbucheg)


Lesenswert?

Hmm
Ich denke in der Tat, dass du einen Compilerfehler
entdeckt hast. Ist zwar nur eine Warnung und der gcc
erzeugt trotzdem Code, aber immerhin.

Nebenbei:
Warum erzeugtst du das ifstream object dynamisch
zur Laufzeit mittels new. In diesem Program gibt
es keinen Grund dafuer und du hast dir da einen
Logikfehler dadurch eingefangen.

> // Datei oeffnen
> FileObject->open(argv[1],ios::in | ios::binary);
>
> // Datei nichtexistent
>   if (!FileObject){
>   cout << "\nFile nicht ladbar\n" << endl;
>   exit(1);
> }

Das wolltest du ganz sicher so nicht haben.
Du wolltest mit Sicherheit haben:

    if( !*FileObject ) {
      cout ....

Auch wenn viele über die Hungarian Notation die Nase rümpfen
(inklusive mir), so habe ich doch etwas davon übernommen, was
sich bewährt hat. Bei mir beginnt der Name jeder Pointer Variablen
mit einem kleinen 'p'.

Dann wäre bei dir im Original gestanden

   if( ! pFileObject )

und es wäre offensichtlich, dass hier einfach nur ein Pointer
abgefragt wird und nicht das Objekt selbst, so wie der Code  im
then-Block vermuten lässt.

Aber wie gesagt: Wozu überhaupt der Pointer? Du brauchst ihn
nicht: (Ich hab noch ein paar andere sinnvolle Dinge im Code
geändert)

 ifstream FileObject;

  // Datei oeffnen
  FileObject.open(argv[1],ios::in | ios::binary);

  // Datei nichtexistent
  if (!FileObject) {
    cout << "\nFile nicht ladbar\n" << endl;

// Hast du schon mal Log-Files studiert? Wenn da steht
// Datei konnte nicht geöffnet werden, dann ist das super.
// Hilft dir aber nicht wirklich, denn es bleibt immer noch
// die Frage: WELCHES!
//
// Siehe Microsoft: Eine DLL konnte nicht gefunden werden!
// Super! Wenn ihr uns auch noch sagen würdet welche, könnten
// wir was dagegen tun. So aber ... bleibt nur raten.

    cout << "\nFile nicht ladbar '" << arv[1] << "'\n" <<
endl;

// Beachte auch: Ich schliesse den Filenamen in ' ein.
// Damit kann man erkennen ob man irgendwelche Sonderzeichen
// und sei es nur ein Leerzeichen, im String drinn hat.

    exit( EXIT_FAILURE );
  }

  // Filegroesse ermitteln
  FileObject.seekg( 0, istream::end );
  FileSize = FileObject.tellg();

  // setze seekg-pointer auf start
  FileObject.seekg( 0, istream::beg );

// Tja. Mit dem nächsten wirst du dir deine wunderbare
// ermittelste FileSize zerstören
  FileSize=FileObject->tellg();

// Hey. geht doch. Ja genau. So macht man das
  ifstream test;

  printf("\n%d\n",sizeof(test));

  printf("\n%d\n",sizeof(*FileObject));
  //test
  printf("%4X\n",1000);

  // hauptschleife
  while(1){
  key=getc(stdin);
  switch( key ){
    case 'h'  : printhelp();
      break;

// da printx eine Adresse will, geben wir ihr halt eine
    case 'n' : printx(&FileObject );


Anzumerken wäre noch, dass ein C++ Programmierer, hier
wahrscheinlich keinen Pointer übergeben würde, sondern
printx ganz einfach mit einer Referenz als Argument ausstatten
würde:

  void printx( ifstream& stream )
  {
    ...
  }

Weiters sollte man noch anmerken:
  Das mischen von cout und printf ist gefährlich. Da kann alles
  mögliche unerwartete passieren. Entscheide dich für eines
  von beiden: entweder nur printf oder nur cout
  und bleib dabei.
  Offiziell haben die beiden Ausgabestreams nämlich nichts mit-
  einander zu tun, so dass absolut nicht geregelt ist, in welcher
  Reihenfolge Ausgaben gemacht werden, wenn über beide Ausgabestreams
  Ausgaben erfolgen.

von Rolf Magnus (Gast)


Lesenswert?

>   Offiziell haben die beiden Ausgabestreams nämlich nichts mit-
>   einander zu tun, so dass absolut nicht geregelt ist, in welcher
>   Reihenfolge Ausgaben gemacht werden, wenn über beide
>   Ausgabestreams   Ausgaben erfolgen.

Das ist falsch (wow... muß ich mir im Kalender anstreichen). C- und
C++-I/O werden per Default automatisch syncrhonisiert und können
beliebig gemischt werden. Erst ein Aufruf von
std::ios_base::sync_with_stdio(false) ändert das.

von SiO2 (Gast)


Lesenswert?

@Karl Heinz
Das mit cout und printf ist mir bewusst und habs aber erst mal gelassen
;).
Aber die Reihenfolge der Ausgabe sollte doch eingehalten werden, wenn
ich printf vor cout habe, sollte doch printf auch eher ausgeführt
werden.
Die Fehlermeldung, das die datei nicht ladbar war, bezieht sich ja auf
die in der kommandozeile angegebenen datei, aus dem kontext raus weis
man welche datei es ist ( jaja die faulen leute ;) )
Die dynamische zuweisung hatte ich erstmal gemacht, weil mein eigener
code ohne dyn. zuw. nicht ging.
Die mehrfache FileSize zuweisung war noch aus testzwecken drin.
Ich werds heute nochmal mit Referenzparametern testen (und auch nochmal
mit Pointern und versuchen es auch mit gcc zum laufen zu bringen)

Besten Dank für die Hilfe.

von Björn (Gast)


Lesenswert?

"Auch wenn viele über die Hungarian Notation die Nase rümpfen
(inklusive mir), so habe ich doch etwas davon übernommen, was
sich bewährt hat. Bei mir beginnt der Name jeder Pointer Variablen
mit einem kleinen 'p'."

Jep, das kann sehr hilfreich sein!

von Karl heinz B. (kbucheg)


Lesenswert?

> C- und C++-I/O werden per Default automatisch syncrhonisiert

Hmm. War das schon immer so oder trügt mich mein
Gedächtnis (soll schon mal vorkommen).
Rolf, wir haben doch lange Zeit in comp.lang.c++ vor
solchen Dingen gewarnt.

von Karl heinz B. (kbucheg)


Lesenswert?

<Kurze google Recherche später>

Tja. Da bin ich ja schön reingefallen. Das synchronisieren
gabs anscheinend schon immer. Aber anscheinend gabs früher
Implementierungen bei denen das nicht so richtig funktioniert.
Und ich glaub mein Gedächtnis trügt auch: So dunkel
kann ich mich an die Situationen erinnern, bei denen Leute
über cout irgendwelche Prompts ausgaben und über getchar()
Zeichen einlesen (oder noch schlimmer: ueber getchr() ) und
sich wunderten warum das so nicht klappt.
Irgendsowas in dieser Richtung. Ja, ja. Alt sollte man halt
nicht werden :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.