Avatar billede virtualfriend Nybegynder
12. december 2001 - 13:40 Der 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??
Avatar billede jpk Nybegynder
12. december 2001 - 14:01 #1
Fra MSDN

Friend Functions
C++ Specific —>

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.

END C++ Specific

Avatar billede wisen Nybegynder
12. december 2001 - 14:12 #2
jpk -> Det er bare ikke en funktion der ligger på en anden klasse ;)
Avatar billede wisen Nybegynder
12. december 2001 - 14:17 #3
Prøv med :

class Klasse1 {
// ...
  int GetInteger();
// ...
};

class Klasse2 {
//...
  friend int Klasse1::GetInteger();
//...
};
Avatar billede jpk Nybegynder
12. december 2001 - 14:24 #4
->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)

Avatar billede wisen Nybegynder
12. december 2001 - 14:29 #5
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....
Avatar billede virtualfriend Nybegynder
12. december 2001 - 15:55 #6
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!
Avatar billede jpk Nybegynder
12. december 2001 - 16:05 #7
Om den metode du kalder i den anden klasse bruger nogle af dens private data er da helt ligegyldigt!

Det er absolut ikke pænere end at lave en pointer og derved få adgang til de metoder objektet tilbyder!

Alt i alt lyder det til du er ved at få banket et lettere urobust design sammen...
Avatar billede virtualfriend Nybegynder
13. december 2001 - 00:40 #8
Til jpk:
Du skal ikke kritiserer når du ikke kan en skid.
Hvorfor tror du muligheden eksisterer hvis man aldrig må bruge den? Æggehoved!
Avatar billede jpk Nybegynder
13. december 2001 - 08:32 #9
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...

Avatar billede mickni33 Nybegynder
13. december 2001 - 09:41 #10
Virtualfriend>>
du må være noget stresset siden du farer op så nemt
Avatar billede soepro Nybegynder
13. december 2001 - 12:00 #11
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:
Avatar billede soepro Nybegynder
13. december 2001 - 12:03 #12
class Klasse1
{
  private:
  int iA;
  int getA(void);
  void setA(int v);
  public:
  __property int a=(read=getA,write=setA,default=0);
}

Du kan så i Klasse2 bruge k1.a direkte:

  b = k1.a = value;

men vil så i virkeligheden få udført:

  k1.setA(value);
  b = k1.getA();

dvs. kørt de to get/set rutiner - og dermed bevare den fulde kontrol.
Avatar billede soepro Nybegynder
13. december 2001 - 12:36 #13
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.)
Avatar billede kamikaze Nybegynder
13. december 2001 - 16:05 #14
Syntaxen til at lave en friend funktion er:

class Klasse2
{
  //....
};

class Klasse1
{
private:
    int a;
public:
    int GetA(){return a;}
    void SetA(int tal) friend class Klasse2;
};

void Klasse1::SetA(int tal){a=tal;}

Nu er SetA(int tal) friend til Klasse2. Husk at den klasse du vil gøre til friend, skal være defineret inden du kan bruge den.
Avatar billede virtualfriend Nybegynder
14. december 2001 - 07:04 #15
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.
Avatar billede kamikaze Nybegynder
14. december 2001 - 14:13 #16
Det er også det jeg har vist dig syntaxen til... I mit eksempel er det KUN den pågældende metode (SetA()) der er friend.
Avatar billede kamikaze Nybegynder
14. december 2001 - 14:14 #17
Hvis hele klassen skal være friend, er syntaxen:

class Klasse1
{
  //...
  void SetA(int tal);
  friend class Klasse2;
};
Avatar billede virtualfriend Nybegynder
14. december 2001 - 22:46 #18

Mangler du ikke en funktion i klasse1 som klasse2 kan være friend til??
Der er jo ikke nogen funktioner i klasse1.
Sådan her:

Class1 {
void getnavn(){return navn;}
}

class2 {
friend class1::getnavn();
}

Her er Class2 ven af getnavn() i class1.

Det du skriver fatter compileren ikke noget af.
Avatar billede kamikaze Nybegynder
15. december 2001 - 14:30 #19
Nej, nej. Der er en funktion i klasse1 der hedder \'void SetA(int tal)\'. Det er denne funktion klasse2 er friend til.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester