12. december 2001 - 13:40Der er
18 kommentarer og 1 løsning
FriendFunktion??
Hej!
Er der nogen der ved hvordan man laver en friend af en funktion fra en anden klasse, så man har adgang til den funktion og kun dén?? Jeg ved at man skriver den i den klasse hvorfra man ønsker at bruge den, men hvordan er syntaxen??
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
A friend function is a function that is not a member of a class but has access to the class\'s private and protected members.
A friend function is declared by the class that is granting access. The friend declaration can be placed anywhere in the class declaration. It is not affected by the access control keywords.
Example 1
A friend function is defined as a nonmember function:
class Complex { public: Complex( float re, float im ); friend Complex operator+( Complex first, Complex second ); private: float real, imag; }; Example 2
Complex operator+( Complex first, Complex second ) { return Complex( first.real + second.real, first.imag + second.imag ); } In this example, the friend function operator+ has access to the private data members of the Complex objects it receives as parameters.
Notice that the friend keyword does not appear in the function definition.
->wisen: Hvis du fra klasse1 ønsker at kalde en funktion i klasse2, skal du i klasse2 give adgang hertil, Ikke omvendt! Det du foreslår går jo imod den objektorienterede tankegang! (friend-funktioner er jo i det hele taget ikke særlig pæne og bør kun anvendes når der ikke er anden \"fornuftig\" udvej)
Nej, det vil jeg give dig ret i; \"friend\" er ikke særlig pænt. Eksemplet er fra C++ biblen, og ikke testet. Når jeg bruger \"friend\" gør jeg som i dit eksempel....
Først til MSDN: Jeg ønsker ikke at få adgang til private data som du tror. Jeg ønsker at få adgang til en funktion i en anden klasse fra den klasse jeg er i nu. Det kan godt være det ikke er særlig pænt, men jeg har ikke noget valg, og desuden er det pænere end at lave en pointer til klassen og derved få adgang til alle funktionerne i klassen. Der må da være en her som ved hvordan!
Er det nu jeg skal sige tillykke med din 10-års fødselsdag?
Hvad angår mit hoved, så tror jeg ikke det ligner mere et æg, end resten af befolkningens!
Jeg har da heller ikke på noget tidspunkt skrevet om friend deklerationen, at man \"aldrig må bruge den\", derimod at man kun bør anvendes når der ikke er nogen anden fornuftig udvej. Udfra det du har beskrevet ER der bedre metoder...
Kan du ikke forstå at jeg bare prøver at få dig til at tage den rigtige beslutning i stedet for at arbejde videre med én der blot vil forringe dit design? Du må da meget undskylde hvis jeg har fornærmet dig og beslutningen er selvfølgelig din egen...
friend er da netop kernen i objektorientering, idet den anvendes til at definere en helt klar, pænt skåret snitflade mellem to \"ligestillede\" klasser - helt analogt til interfaces i JAVA.
friend er kun nødvendig, hvis du ønsker at funktionen i klasse2 skal anvende klasse1\'s private funktioner/og eller data direkte - ellers kan du jo bare bruge en af de public funktioner.
Generelt må jeg tilslutte mig rådet om ikke at tilgå/manipulere private variabler direkte: lave istedet to public set og get funktioner til hver variabel, så kan du laver din klasse tread-safe og tilføje f.eks. validitets check osv. i dem, og således eet centralt sted checke at alt går korrekt til.
class Klasse1 { private: int a; public: int getA(void); bool setA(int value); } class Klasse2 { private: int b; Klasse1 k1; public: void dublicer(int value); }
int Klasse1::getA(void) { return a; } bool Klasse1::setA(int value) { if (value >= 0 && value <= 30) { a = value; return true; } return false; }
void Klasse2::dublicer(int value) { b = value; k1.setA(value); }
I C++ Builder (jeg ved ikke om MVC understøtter det samme) kan du lave såkaldte property variabler, som indkapsler setter og getter funktionen helt:
friend funktionaliteten er vel tiltænkt netop det eksempel, som der er på MSDN, nemlig at man har en generel funktion, som anvendes af flere forskellige klasser, der IKKE er nedarvet fra den samme grundklasse. (For så kunne man blot lægge funktionaliteten der.)
Først til jpk: Det kan godt være at du prøver at få mig på bedre tanker. Men jeg ber ikke om sådan noget medmindre det er en nødløsning. Prøv at forstå det.
Og så til Kamikaze: Det er en friend funktion jeg er ude efter. Det er kun én funktion jeg ønsker at gøre til friend i den anden klasse. De andre funktioner i klasse ønsker jeg ikke adgang til. Så jeg prøver ikke at gøre klasse1 til en friend af klasse2. Det er som sagt kun ÉN funktion jeg er ude efter i klasse2.
Nej, nej. Der er en funktion i klasse1 der hedder \'void SetA(int tal)\'. Det er denne funktion klasse2 er friend til.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.