c++ Anfänger
-
Hi ich hab hier im folgenden Code-Abschnitt einen Fehler beim compilieren, jedoch verstehe ich nicht woran es liegt. Oder liegt es daran, dass die Fkt. str() nicht bekannt ist?
Code:
class Value : public Node { double value; public: stringc toString() { return(str(value)); };Compiler Fehler:
error: 'str' was not declared in this scopedie Fkt str() ist in einer Header Datei definiert:
class stringc { char *s; int l; char *sep; char *tk; int tp; public: friend stringc str(const double v);und sowie im Quellcode:
stringc str(const double v) { char sx[80]; sprintf(sx, "%g", v); return (stringc)sx; }Woran könnte es liegen, dass ich diesen Compiler error kriege?
Kann mir jmd. bitte helfen?
-
Hallo,
und ist sicher gestellt, das die Funktion str hier:
stringc toString() { return(str(value));schon bekannt ist (ist ja eine andere Klasse, vielleicht sogar Datei), d.h. vor diesem Punkt deklariert wurde?
MfG,
Probe-Nutzer
-
Die Funktion ist in der Headerdatei nicht definiert. Sie ist dort nicht einmal deklariert. Eine friend-Angabe ist nicht automatisch eine Deklaration.
Du musst die Funktion noch einmal vor der Klasse deklarieren.Achja: Header ist auch eingebunden?

-
bladeexx schrieb:
...liegt es daran, dass die Fkt. str() nicht bekannt ist?
=>
bladeexx schrieb:
...
Compiler Fehler:error: 'str' was not declared in this scopeAlso: Jupp.
Der Compiler "liest" Deinen Quellcode genauso, wie Du es tust: Von links nach rechts und von oben nach unten. Und die auftauchenden Zeichenfolgen muss er "irgendwie einsortieren" können ... und das geht eben mit "str" nicht.
Wie der Lord schon gesagt hat: Der Compiler muss zumindestens an einem "Funktionsprototypen" (Funktionsdeklaration ohne Körper) "vorbeigekommen sein" (z.B. in einem Header).Gruß,
Simon2.
-
Das verstehe ich nicht, ist es nicht so, dass man die Fkt im Header nur deklariert, und im Quellcode für den Header die Fkt. dann beschreibt?
PS: ja Header ist eingebunden
-
Aber so wie ich es sehe ist doch die Fkt. str() in einem Header deklariert
-
Schreib doch bitte mal dazu in welchen Dateien die gezeigten Code-Teile sind und wann du welche Header wo einbindest.
-
Eine friend-Deklaration (allein) bewirkt nicht, dass der deklarierte Name im umschließenden Namensraum bei unqualifiziertem Namelookup sichtbar wird. Dazu bedarf es einer zusätzlichen Deklaration in diesem Namensraum. Eine Funktion, die nur per friend deklariert wurde, kann zwar - trotz der fehlenden Sichtbarkeit im Namensraum - per ADNL gefunden werden, aber ein double hat keinen assoziierten Namensraum, der durchsucht werden könnte.
-
**funktion.h:
**
Code:class Value : public Node { double value; public: stringc toString() { return(str(value)); };die Fkt str() ist in einer Header Datei string.h definiert:
class stringc { char *s; int l; char *sep; char *tk; int tp; public: friend stringc str(const double v);und sowie im Quellcode string.cpp:
stringc str(const double v) { char sx[80]; sprintf(sx, "%g", v); return (stringc)sx; }PS: So wie ich es aus dem Buch entnehmen kann, muss man doch im Header nur den Grundgerüst der Fkt. beschreiben, und die Fkt. selbst kann man doch wo anders definieren oder? und mit friend anweisung sagt man dass die Fkt auf private Eigenschaften der Klasse zugriff hat
-
camper schrieb:
Eine friend-Deklaration (allein) bewirkt nicht, dass der deklarierte Name im umschließenden Namensraum bei unqualifiziertem Namelookup sichtbar wird. Dazu bedarf es einer zusätzlichen Deklaration in diesem Namensraum. Eine Funktion, die nur per friend deklariert wurde, kann zwar - trotz der fehlenden Sichtbarkeit im Namensraum - per ADNL gefunden werden, aber ein double hat keinen assoziierten Namensraum, der durchsucht werden könnte.
Das Heisst ich muss die Fkt str() noch mal in der Header Datei string.h deklarieren? Also nur den Grundgerüst? oder kann man irgendwie anders noch auf die Fkt. verweisen?
-
Liest Du unsere Beiträge?
Ursache:
LordJaxom schrieb:
Die Funktion ist in der Headerdatei nicht definiert. Sie ist dort nicht einmal deklariert. Eine friend-Angabe ist nicht automatisch eine Deklaration.
Lösung:
LordJaxom schrieb:
Du musst die Funktion noch einmal vor der Klasse deklarieren.
Detaillierte Ausführung: siehe camper.
-
Ja ich lese die Beiträge.
Eine andere Frage, wenn ich die Fkt. vor der Klasse definiere, dann brauche ich doch gar nicht mehr die friend deklaration oder?
-
Das Schlüsselwort
friendbrauchst du sowieso nur, wenn du von aussen auf einprotected-oderprivate-Member zugreifen willst, und nicht, um eine Funktion zu deklarieren.
-
bladeexx schrieb:
Ja ich lese die Beiträge.
Eine andere Frage, wenn ich die Fkt. vor der Klasse definiere, dann brauche ich doch gar nicht mehr die friend deklaration oder?
"Non-friends" dürfen allerdings nicht auf non-public-Member zugreifen....
EDIT: Mal wieder zu spät
Gruß,
Simon2.
-
Nur, dass das eine mit dem anderen nichts zu tun hat. Die Deklaration vor der Klasse macht die Funktion gewissermaßen überhaupt erst bekannt, die friend-Deklaration erlaubt der Funktion Zugriff auf private Mitglieder von stringc. Wenn Du das nicht brauchst, kannst Du die friend-Deklaration natürlich weglassen.
-
Ah, ok ich danke euch vielmals!!!!

mal eine ganz blöde Frage. Kann ich die Fkt. str() ohne den friend operator in der Klasse deklarieren, oder ist es dann keine Daklaration?
-
Klar kannst du das, nur ist deine Funktion dann eine Memberfunktion der Klasse und keine freie Funktion mehr.
-
bladeexx schrieb:
mal eine ganz blöde Frage. Kann ich die Fkt. str() ohne den friend operator in der Klasse deklarieren, oder ist es dann keine Daklaration?
Allmählich bezweifle ich auch, dass du die Beiträge liest...

Nochmals: Mit
frienddeklariert man keine Funktionen, sondern erlaubt den Zugriff von aussen! Das steht übrigens bereits in meinem letzten Post.
-
Braunstein schrieb:
Klar kannst du das, nur ist deine Funktion dann eine Memberfunktion der Klasse und keine freie Funktion mehr.
D.h. in meinem Fall könnte ich auch der Klasse Value noch die Klasse Stringc vererben und den friend opeator wegnehme dann müsste auch gehen oder? Oder bringe ich da jetzt was durcheinander?
-
Nexus schrieb:
Allmählich bezweifle ich auch, dass du die Beiträge liest...

Doch ich lese das alles, nur es ist viel neues für mich und ich will und versuche es zu verstehen, sry dass es bei mir nicht sofort ankommt und ich vieles nachfragen muss
