C++/Class/Friend — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
м (1 версия: Импорт контента...)
 
(нет различий)

Версия 14:21, 25 мая 2010

Define friend function for

  
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class StringClass {
  char *p;
  int len;
public:
  StringClass(char *ptr);
  ~StringClass() {
     delete [] p;
  }
  friend ostream &operator<<(ostream &stream, StringClass &ob);
};
StringClass::StringClass(char *ptr)
{
  len = strlen(ptr)+1;
  p = new char [len];
  if(!p) {
    cout << "Allocation error\n";
    exit(1);
  }
  strcpy(p, ptr);
}
ostream &operator<<(ostream &stream, StringClass &ob)
{
  stream << ob.p;
  
  return stream;
}
int main()
{
  StringClass stringObject1("www.java2s.com"), stringObject2("www.java2s.com");
  cout << stringObject1;
  cout << endl << stringObject2 << endl;
  return 0;
}


friend class for each other

   
#include <iostream>
#include <string.h>
using namespace std;
class Curly 
{
 public:
   Curly(char *msg) { strcpy(message, msg); };
   void show_message(void) { cout << message << endl; };
   friend class Moe;
   void show_moe(class Moe moe);
 private:
   char message[256];
 };

class Moe 
{
 public:
   Moe(char *msg) { strcpy(message, msg); };
   void show_message(void) { cout << message << endl; };
   friend class Curly;
   void show_curly(class Curly curly);
 private:
   char message[256];
 };

void Curly::show_moe(class Moe moe) { cout << moe.message << endl; };
void Moe::show_curly(class Curly curly) { cout << curly.message << endl; };
int main(void)
{
   class Moe moe("nuck...");
   class Curly curly("whoop...");
 
   moe.show_message();
   moe.show_curly(curly);
   curly.show_message();
   curly.show_moe(moe);
}


Friend function Demo

  
#include <iostream>
using namespace std;
class myclass {
  int num;
public:
  myclass(int x) { 
     num = x; 
  }
  friend int isneg(myclass ob);
};
int isneg(myclass ob)
{
  return (ob.num < 0) ? 1 : 0;
}
int main()
{
  myclass a(-1), b(2);
  cout << isneg(a) << " " << isneg(b);
  cout << endl;
  return 0;
}


Friends can access private members of a class.

  
#include <iostream>
using std::cout;
using std::endl;
class Count {
   friend void setX( Count &, int ); 
public:
   Count() { x = 0; }                
   void print() const { cout << x << endl; }
private:
   int x;
}; 
void setX( Count &c, int val )
{
   c.x = val;  // legal: setX is a friend of Count
}
int main()
{
   Count counter;
   cout << "counter.x after instantiation: ";
   counter.print();
   cout << "counter.x after call to setX friend function: ";
   setX( counter, 8 );  // set x with a friend
   counter.print();
   return 0;
}


Make the inserter into a friend function

  
#include <iostream>
#include <cstring>
using namespace std;
class PhoneNumber {
  char name[80];
  int areaCode;
  int prefix;
  int num;
public:
  PhoneNumber(char *n, int a, int p, int nm)
  {
    strcpy(name, n);
    areaCode = a;
    prefix = p;
    num = nm;
  }
  friend ostream &operator<<(ostream &stream, PhoneNumber o);
};
// Display name and phone number.
ostream &operator<<(ostream &stream, PhoneNumber o)
{
  stream << o.name << " ";
  stream << "(" << o.areaCode << ") ";
  stream << o.prefix << "-" << o.num << "\n";
  return stream; // must return stream
}
int main()
{
  PhoneNumber a("T", 111, 555, 1234);
  PhoneNumber b("A", 312, 555, 5768);
  PhoneNumber c("T", 212, 555, 9991);
  cout << a << b << c;
  return 0;
}


Use friend function to access the non-public member variable

  
#include <iostream>
using namespace std;
class MyClass {
  int a, b;
  public:
    friend int sum(MyClass x);
    void set_ab(int i, int j);
};
void MyClass::set_ab(int i, int j)
{
  a = i;
  b = j;
}
int sum(MyClass object)
{
  return object.a + object.b;
}
int main(void)
{
  MyClass integer;
  cout << "Adding 3 and 4:" << endl;
  integer.set_ab(3,4);
  cout << sum(integer);
}