Instanzen
-
jo das geht...dazu musst du den >> operator überladen.
-
wie geht das genau habe jetzt noch nicht so viel Erfahrung mit C++!
-
solange du uns nicht die deklaration + definition der klasse zeigen kannst,
können wir dir nicht helfen, ich (und die meinsten anderen auch) können
nicht hellsehen, was du geschrieben hast.deklaration ist der teil wo
class CVersuch { //........... };steht.
definition ist wo
CVersuch::CVersuch(...) { }ohne code gehts nicht
-
naja darum geht es mir ja unter anderem auch ich weis nicht wie ich die Klasse deklarieren soll damit soetwas geht!:-)
class CVersuch
{
public:
int LesenWert(void);protected:
int wert;
};int CVersuch::LesenWert(void)
{
return wert;
}wenn mir das jemand anhand eines so einfachen bsp zeigen köntte wäre das super!
-
class CVersuch { public: friend ostream &iperator >> (istream &, CVersuch &); }; ostream &operator >> (istream &i, CVersuch &v) { int wert; i >> wert; v.wert = wert; }frei aus dem kopf hingeschrieben sollte so aber ungefähr funktionieren
-
muss natürlich istream heißen und operator

-
also ich bekomme diese Fehler:
d:\C Programme\test\CVersuch.cpp(6) : error C2556: 'std::ostream &operator >>(std::istream &,CVersuch &)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'std::istream &operator >>(std::istream &,CVersuch &)'
d:\C Programme\test\CVersuch.h(4): Siehe Deklaration von 'operator>>'' d:\\C Programme\\test\\CVersuch.cpp(6) : error C2371: 'operator>>'': Neudefinition; unterschiedliche Basistypen
d:\C Programme\test\CVersuch.h(4): Siehe Deklaration von 'operator`>>''und kann damit nivht sehr viel anfangen!
könntest du mir bitte den code ein wenig beschreiben damit ich ihn besser verstehe!
-
dann mal der ganze code

#include <iostream> using namespace std; class CVersuch { public: friend istream &operator >> (istream &, CVersuch &); int LesenWert() const; // die funktion verändert nichts private: // private passt hier besser als protected int wert; }; int CVersuch::LesenWert() const { return wert; } istream &operator >> (istream &i, CVersuch &v) { int wert; i >> wert; v.wert = wert; } int main() { CVersuch V; cout << "Wert? :"; cin >> V; cout << endl << "Wert war: " V.LeseWert() << endl; }immernoch aus dem kopf also keien garantie

-
schon spät heute

nach zeile 21 muss noch ein "return i;" hin
sorry *gähn*
-
istream &operator >> (istream &i, CVersuch &v)
{
int wert;
i >> wert; //1.
v.wert = wert; //2.
}also wenn ich das jetzt richtig verstanden habe dann wird bei 1. der Wert der von der Tastatur eingelesen worden ist der Variablen wert übergeben?
und bei 2. wird dan dieser wert der Variablen aus der Klasse Übergeben oder?und es gibt noch eine Fehlermeldung die anderen habe ich wegbekommen!:-)
error C4716: 'operator>>': Muss einen Wert zurückgeben
dieser Fehler bezieht sich auf den obigen code!
weis nicht wie ich den wegbekomme!
-
servus123 schrieb:
also wenn ich das jetzt richtig verstanden habe dann wird bei 1. der Wert der von der Tastatur eingelesen worden ist der Variablen wert übergeben?
und bei 2. wird dan dieser wert der Variablen aus der Klasse Übergeben oder?jop, du kannst auch direkt "i >> v.wert" schreiben
den fehler bekommst du auch weg, siehe vorpost
-
ok das geht jetzt danke!:-)
und bei zuweisungen wie z.b. v=123; geht das ähnlich oder?
halt nicht mit dem istream oder?
-
noch was zum vorhärigen code
class CVersuch
{
public:
friend istream &operator >> (istream &, CVersuch &); //1.
int LesenWert() const; // die funktion verändert nichts //2.
private: // private passt hier besser als protected //3.
int wert;
};also bei 1. komme ich noch nicht so ganz klar mit dem code wenn du ihn mir etwas erklären könntest damit ich es besser verstehe?
Danke

-
da brauchst du den zuweisungsoperator !
du musst aber noch einen standardzuweisungsoperator hinzufügen, damit
du das objekt normal kopieren kannstfolgendes bitte hinzufügen, nicht ersetzen

in der klasse
CVersuch &operator = (const CVersuch &); CVersuch &operator = (int);und dann irgentwo dahinter
CVersuch &CVersuch::operator = (const CVersuch &V) { wert = V.LeseWert(); // oder wert = V.wert; // beides funktioniert return *this; // wir geben unser eigenes objekt auch noch zurück } CVersuch &CVersuch::operator = (int wert) { // da wir jetzt ein lokales wert haben entsteht doppeldeutigkeit // deshalb können wir "unser" wert über den klassennamen // oder über this ansprechen CVersuch::wert = wert; // oder: this->wert = wert; // oder wir nennen den parameter anders :) return *this; }das return *this bewirkt, das wir sowas schreiben können
CVersuch a, b, c, d; a = b = c = d = 1;der wert wird "durchgereicht"
falls du auch noch
CVersuch V(3);schreiben willst kannst du einen konstruktor hinzufügen
// in der klasse, sollte public sein CVersuch(int i) : wert(i) // initialisierungsliste { }wenn man methoden wie den konstruktor, zuweisungsoperator oder kopierkonstruktor
überläd (selber schreibt), dann wird die standardmethode ausgestellt.
dann kannst du das objekt z.b. nicht mehr kopieren, zuweisen oder erstellen
-
wir müssen die postings besser timen, immer kommt da noch ne frage davor

servus123 schrieb:
class CVersuch
{
public:
friend istream &operator >> (istream &, CVersuch &); //1.
int LesenWert() const; // die funktion verändert nichts //2.
private: // private passt hier besser als protected //3.
int wert;
};bei 1.) wird ein istream und das objekt genommen und dann das geänderte
istream-objekt zurückgegebenz.b. für diese wiederholten '>>'
CVersuch V; cin >> V; // ist: operator >> (cin, V); // >> ist auch eine funktion, das wäre ihr funktionsaufruf CVersuch a, b, c; cin >> a >> b >> c; // das entspricht: operator >> (operator >> (operator >> (cin, a), b), c) // zuerst wird a eingelesen, dann das objekt "cin" per rückgabewert übergeben und b eingelesen...2.) wenn eine methode keine werte verändert, also nur "liest", deklariert
man sie als "const", d.h. sie kann auch auf konstante objekte aufgerufen werdenconst CVersuch V(1); cout << V.LeseWert(); // muss const sein3.)
es gibt 3 zugriffsarten:
public
private
protectedpublic ist klar: jeder kommt an das objekt ran
private ist auch klar: nur die klasse selber kommt ran
an protected kommt die klasse natürlich auch selber ran (wär sonst sinnlos),
aber auch abgeleitete klassenz.b.
class CVersuch2 : public CVersuch // hier leiten wir eine klasse von CVersuch ab { public: int LeseSumme() const { return wert2 + wert; // abgeleitete klassen übernehmen alles ihrer basisklassen, auch wert } private: int wert2; }wenn wert private wäre, würde das schief gehen bei protected nicht
wenn man aber protected nimmt, signalisiert man so, das man auch ableiten will,
priavte sagt: das ist die einzige klasse dieser art
(natürlich kommt man mit tricks ran :P)
-
@ servus123:
Wie drakon schon angedeutet hat, wäre es sicher nicht schlecht, wenn du dich von Grund auf mit der Thematik befassen würdest. Ich habe nämlich das Gefühl, dir fehlen grundsätzliche Verständnisprobleme bei Klassen. Zum anderen sind Fehlermeldungen zum Lesen da, in den meisten Fällen beschreiben sie den Fehler sehr genau.
helferlein schrieb:
muss natürlich istream heißen und operator

"ostream iperator" ist aber mal echt kreativ.

helferlein schrieb:
wenn man aber protected nimmt, signalisiert man so, das man auch ableiten will,
priavte sagt: das ist die einzige klasse dieser art
(natürlich kommt man mit tricks ran :P)Naja.
privatekann auch in Vererbungshierarchien Sinn machen, nämlich dann, wenn auch abgeleitete Klassen keinen Zugriff auf die Member haben sollen. Und mit den Tricks spielst du wohl auffriendan?
-
mit den tricks meine ich zeiger
