Archiv verlassen und diese Seite im Standarddesign anzeigen : was hat das & zu bedeuten ?
Hallo Leute,
ich lerne gerade C++ und bin auf die Frage gestoßen, was bei der deklaration von get() das & bedeutet. Es kann ja wohl nicht der Adressoperator sein, oder ist es eine Referenz ? wenn ja, wie ist es gemeint ? hier der fragliche code:
istream & get(char *buf, int num, int t='\n');
gruss silic
anda_skoa
19-06-2002, 08:15
& hat drei Bedeutungen.
Wenn es zwischen zwei Werten oder Varibalen steht, dann ist es ein bitweises UND.
Wenn es vor einer Variablen steht, ist es der Adressoperator.
Wenn es nach einem Typ in einer Deklaration steht, ist es dei Referenz des Typs.
In deinem Fall also, Referenz auf den stream.
Ciao,
_
Bedeutet das, das die Funktion get in dem stream definiert ist und, da es auch ein get mit weniger parametern gibt es sich um einen konstruktor handelt ?
Wenn ich int a;int& b=a; schreibe ist b eine Referenz von a, dh mit b benutze ich den Speicherplatz von a, also b ist ein ein anderer Name für a. Soweit habe ich Referenz kapiert. Wie ist das aber bei Funktionen wie dem get zu verstehen ?
silic
hier ein Beispiel was ich ohne fehler kompilieren konnte:
//##########################################
class beispiel
{
int x;
public:
void set(int i);
};
void beispiel::set(int i)
{
x=i;
};
void main(void)
{
beispiel& set(void);
}
//###############################
Frage: was bedeutet jetzt set in main ?
Gruss silic
tkortkamp
19-06-2002, 12:27
Uhh...
Was soll das beispiel& set(void) sein?
Soll das sowas sein wie
beispiel s;
beispiel& set = s;
?
anda_skoa
19-06-2002, 14:28
Original geschrieben von silic
void main(void)
{
beispiel& set(void);
}
Frage: was bedeutet jetzt set in main ?
Das bedeutet, dass du dann eine Instanz von beispiel hast, die set heißt.
ciao,
_
anda_skoa
19-06-2002, 14:33
Original geschrieben von silic
Bedeutet das, das die Funktion get in dem stream definiert ist und, da es auch ein get mit weniger parametern gibt es sich um einen konstruktor handelt ?
Ein Konstrutor hat keinen Rückgabewert.
Ich schätze, get ist hier eine Methode von istream, oder?
Das heißt dann nur, dass der Rückgabewert der Methode, eine Referenz auf einen Stream ist.
Die Streamoperatoren << und >> sind so definiert.
Sie geben immer die Referenz auf die Streaminstanz zurück, sont könnte man nicht mehrere solcher Operatoren hintereinander schreiben.
int i;
int j;
std:cin >> i >> j;
Das geht nur, weil >> so deklareirt ist, dass es einen istream zurückliefert, sonst hätte der zweite >> Aufruf keine linke Seite.
Ciao,
_
eine Instanz von beispiel scheint es nicht zu sein: hier ein Beispiel:
//************************
#include <iostream.h>
class beispiel
{
int x;
public:
void set(int i);
void set(void);
};
void beispiel::set(int i)
{
x=i;
cout << x << endl;
};
void beispiel::set(void)
{
x=4711;
cout << 4711 << endl;
};
void main(void)
{
beispiel& instanz(void); // was bewirkt diese Zeile ?
instanz.set(1234);
//Compileroutput: x.cpp:27: request for member `set'
// in `instanz', which is of non-aggregate type `beispiel & ()()'
}
////////////////////////////////
ist es nicht ein ulkiger typ ? 'beispiel & () ()' was ist das ?
silic
Original geschrieben von anda_skoa
Ich schätze, get ist hier eine Methode von istream, oder?
Das heißt dann nur, dass der Rückgabewert der Methode, eine Referenz auf einen Stream ist.
Die Streamoperatoren << und >> sind so definiert.
Sie geben immer die Referenz auf die Streaminstanz zurück, sont könnte man nicht mehrere solcher Operatoren hintereinander schreiben.
_
danke! das klingt echt einleuchtend.
Gruss silic
Original geschrieben von silic
istream & get(char *buf, int num, int t='\n');
dies ist sicherlich eine Deklaration, ich habe es mal mit einem anschliessenden funktionsrumpf probiert, hier das beispiel:
#include <iostream.h>
class beispiel
{
int x;
public:
void set(int i);
void set(void);
};
void beispiel::set(int i)
{
x=i;
cout << x << endl;
};
beispiel& instanz(void)
{
cout << 5678 << endl;
return *new beispiel;
};
void main(void)
{
instanz().set(1234);
}
dieses Proggi gibt folgendes aus:
5678
1234
womit der Kontrollfluss offensichtlich ist. instanz ist referenz zu einem speicherobjekt welches durch *new beispiel erzeugt wurde.
Ich glaube damit ist das Thema durch. Danke an alle die sich dazu geäußert haben.
silic
tkortkamp
19-06-2002, 15:55
Auch wenn das jetzt blöde klingt, aber dein Code kompiliert mit gcc 3.1 nur mit warnungen und fehlern, weil iostream.h nicht (mehr?) im C++-Standard ist. nimm iostream und füge die anweisung using namespace std; dem Programm hinzu. Die main-Funktion muss übrigens einen integer zurückgeben.
c ya,
Tobias
Original geschrieben von tkortkamp
Auch wenn das jetzt blöde klingt, aber dein Code kompiliert mit gcc 3.1 nur mit warnungen und fehlern, weil iostream.h nicht (mehr?) im C++-Standard ist. nimm iostream und füge die anweisung using namespace std; dem Programm hinzu. Die main-Funktion muss übrigens einen integer zurückgeben.
c ya,
Tobias
ich benutze g++, keine Ahnung welche Version das Ding hat, außerdem habe ich vergessen den speicherbereich wieder freizugeben. Dieser Code soll ja auch nur den Gebrauch von & etwas klären. Was meinst du mit iostream ? soll ich #include <iostream> schreiben ? und was ist using namespace std ?
sorry, bin immernoch anfänger in c++, aber an c kann ich mich noch gut erinnern :rolleyes: deshalb habe ich wohl chancen :D
silic
Original geschrieben von tkortkamp
Auch wenn das jetzt blöde klingt, aber dein Code kompiliert mit gcc 3.1 nur mit warnungen und fehlern, weil iostream.h nicht (mehr?) im C++-Standard ist. nimm iostream und füge die anweisung using namespace std; dem Programm hinzu. Die main-Funktion muss übrigens einen integer zurückgeben.
c ya,
Tobias
sorry, aber gcc ist der GNU C Compiler und der g++ ist der c++compiler. daher deine Fehlermeldungen. teste meinen code doch mal mit g++.
silic
anda_skoa
19-06-2002, 16:57
tkortkamp hat schon den g++ gemeint, allerdings den von GCC3
Der ist da genauer.
Der C++ Header der streams heißt iostream nicht iostream.h
Meist ist das ein Link auf iostream, aber schöner wäre es, wenn man gleich den richtigen Header inkludiert.
Namespaces sind ein neueres Konzept (allerdings schon ein paar Jahre alt).
Man kann darin Elemente deklarieren, deren Name dann nur innerhabl des Namespace eindeutig dein muß.
Der Standardnamespace heißt std.
cout ist zum Beispiel in Wirklichkeit std::cout.
Der g++ nimm implizit an, dass du std benuten willst, darum kompiliert er auch cout ohen das std.
tkortkamp wollte dir nur sagen, dass es wieder besser ist, das explizit hinzuschreiben.
Also entweder am Anfang
using namespace std;
oder std:: vor jedes Element/Funktion aus dem std Namespace.
Ist nicht so wild, wenn man es nicht macht, aber wenn man sich gleich daran gewöhnt, ist es später leichter, wenn Comiler dann vielleicht genauer sind und sonst haufenweise Warnings ausspucken :)
Ciao,
_
tkortkamp
19-06-2002, 16:58
sorry, aber gcc ist der GNU C Compiler und der g++ ist der c++compiler. daher deine Fehlermeldungen. teste meinen code doch mal mit g++.
Nein :) Mit gcc meinte ich das Paket gcc, das auch auf den GNU-Servern liet. Da ist g++ bei.
Ich habe das schon mit g++ kompiliert.
Hier ist dein Beispiel nochmal und zwar so, dass es auch mit gcc 3.1 kompiliert:
#include <iostream>
using namespace std;
class beispiel
{
int x;
public:
void set(int i);
void set(void);
};
void beispiel::set(int i)
{
x=i;
cout << x << endl;
};
beispiel& instanz(void)
{
cout << 5678 << endl;
return *new beispiel;
}
int main(void)
{
instanz().set(1234);
return 0;
}
Zu using namespace:
Du kannst dein Klassen in Namespaces packen z.B. so:
namespace Beispiel
{
class Beispiel
{
public:
Beispiel() {}
~Beispiel() {}
};
}
Diese Klasse sprichst du nun nicht mit Beispiel sondern mit Beispiel::Beispiel an, weil
sie im Namespace Beispiel steht.
Die C++ Standard-Bibliothek hat alle ihre Funktionen im Namespace std. Du müsstest
also std::cout sagen anstatt cout
using namespace std; importiert alle Klassen und Funktionen aus dem Namespace std
in den globalen(?) Namespace, dann darfst du auch cout sagen ;). Wenn du einzelne
Klassen aus einem Namespace holen möchtest musst du z.B. einfach using namespace std::cout; sagen.
c ya,
Tobias
tkortkamp
19-06-2002, 16:59
@anda_skoa:
Es ein Unterschied zwischen #include <iostream> und #include <iostream.h>.
Hier ist mal der Inhalt von iostream.h:
#ifndef _CPP_BACKWARD_IOSTREAM_H
#define _CPP_BACKWARD_IOSTREAM_H 1
#include "backward_warning.h"
#include <iostream>
using std::iostream;
using std::ostream;
using std::istream;
using std::ios;
using std::streambuf;
using std::cout;
using std::cin;
using std::cerr;
using std::clog;
#ifdef _GLIBCPP_USE_WCHAR_T
using std::wcout;
using std::wcin;
using std::wcerr;
using std::wclog;
#endif
using std::ws;
using std::endl;
using std::ends;
using std::flush;
#endif
// Local Variables:
// mode:C++
// End:
c ya
@anda_skoa: danke für die info bzgl namespace !
Für mich stellt sich jetzt die Frage welchen Compiler man nehmen sollte (am besten mit link zum saugen :D ), welcher ist der Beste ?
silic
anda_skoa
19-06-2002, 18:19
Du kannst ruhig den GCC2.95 weiter verwenden.
Das ist im Moment noch der Standardcompiler.
Bis die Distributionen auf den 3er Zweig umsteigen, wird es sicher noch Zeit vergehen.
Ciao,
_
anda_skoa
19-06-2002, 18:21
Original geschrieben von tkortkamp
@anda_skoa:
Es ein Unterschied zwischen #include <iostream> und #include <iostream.h>.
Ja, hast recht, hab nicht wirklich nachgeschaut :)
Ich nahm einfach an, dass es die selbe Datei ist.
Dem ist nicht so, also noch ein Grund mehr, den richtigen header zu benutzen.
Ciao,
_
Original geschrieben von tkortkamp
[B]
Nein :) Mit gcc meinte ich das Paket gcc, das auch auf den GNU-Servern liet. Da ist g++ bei.
Ich habe das schon mit g++ kompiliert.
Hier ist dein Beispiel nochmal und zwar so, dass es auch mit gcc 3.1 kompiliert:
wie ist das wenn ich von gcc3.0 (habe ich jetzt) auf gcc3.1 wechseln will, muss ich da einen tarball kompilieren oder habt ihr ggf. einen RPM für
SuSE 8.0 zur Hand ?
fragend, silic (danke für eure unermüdliche Hilfe)
tkortkamp
19-06-2002, 19:02
Ich hab mit gcc 3.1 mein ganzes System kompiliert. Ich hab den aus dem Tarball kompiliert.
Du musst vorsichtig sein, denn gcc 3.1 führt wieder einmal eine neue ABI ein, d.h. dein z.B. Qt wird nicht mehr mit gcc 3.1 funktionieren. Ich schlag für du bleibst bei deinem jetztigen Kompiler bis SuSE oder andere Distribution auf dem gcc 3.1 basieren. Wenn du dir nicht sicher bist, ob dein Code in gcc 3.1 kompiliert schreib mir ne mail und ich teste ihn.
c ya,
Tobias
@ tobias:
danke für das hilfsangebot :) ich werd also beim gcc3.0 bleiben bis SuSE nachzieht. so, jetzt lese ich mal weiter in meinen online-tutorials :D
silic
PS: Doch noch ne frage,sollte man nachdem man mit gcc3.0 den gcc3.1 compiliert hat, den gcc3.1 nochmal mit gcc3.1 compilieren um das optimum rauszuholen ?
tkortkamp
19-06-2002, 19:21
Macht er automatisch :D
Original geschrieben von tkortkamp
Macht er automatisch :D
cool :D :D
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.