52.67K
Категория: ПрограммированиеПрограммирование

Дружественные функции и классы

1.

Дружественные функции и классы
Дружественная функция — это функция, которая имеет доступ к
закрытым членам класса, как если бы она сама была членом этого класса.
class Anything
{
private:
int m_value;
public:
Anything() { m_value = 0; }
void add(int value) { m_value += value; }
// Делаем функцию reset() дружественной
классу Anything
friend void reset(Anything &anything);
};
// reset() теперь друг класса Anything
void reset(Anything &anything)
{
anything.m_value = 0;
}
int main()
{
Anything one;
one.add(4); // добавляем 4 к m_value
reset(one); // сбрасываем m_value к 0
return 0;
}

2.

class Something
{
private:
int m_value;
public:
Something(int value) { m_value = value; }
friend bool isEqual(const Something &value1, const Something &value2);
};
bool isEqual(const Something &value1, const Something &value2)
{
return (value1.m_value == value2.m_value);
}

3.

Дружественные функции и несколько классов
class Humidity;
class Temperature
{
private:
int m_temp;
public:
Temperature(int temp=0)
{ m_temp = temp; }
friend void Weather(const Temperature
&temperature, const Humidity &humidity);
};
class Humidity
{ private:
int m_humidity;
public:
Humidity(int humidity=0)
{ m_humidity = humidity; }
friend void Weather(const Temperature
&temperature, const Humidity &humidity);
};

4.

void Weather(const Temperature &temperature, const Humidity &humidity)
{
std::cout << "The temperature is " << temperature.m_temp <<
" and the humidity is " << humidity.m_humidity << '\n';
}
int main()
{
Temperature temp(15);
Humidity hum(11);
outWeather(temp, hum);
return 0;
}

5.

Дружественные классы
Один класс можно сделать дружественным другому классу. Это откроет всем
членам первого класса доступ к закрытым членам второго класса.
class Values
{
private:
int m_intValue;
public:
Values(int intValue)
{
m_intValue = intValue;
}
// Делаем класс Display другом класса
Values
friend class Display;
};
class Display
{
private:
bool m_displayInt;
public:
void displayItem(Values &value)
{
std::cout << value.m_intValue <<'\n';
}
};

6.

Несмотря на то, что Display является другом Values, Display не имеет
прямой доступ к указателю *this объектов Values.
Если Display является другом Values, это не означает, что Values также
является другом Display.
Если класс A является другом B, а B является другом C, то это не
означает, что A является другом C.
Использование дружественных функций и классов, может нарушать
принципы инкапсуляции.
Следовательно, ограничивайте количество и использование
дружественных функций и классов.

7.

Дружественные методы
class Values; // предварительное
объявление класса Values
class Display
{
private:
bool m_displayInt;
class Values // полное определение класса Values
{
private:
int m_intValue;
public:
Values(int intValue)
{ m_intValue = intValue; }
public:
// Делаем метод Display::displayItem другом класса
void displayItem(Values &value);
Values
// предварительное объявление выше
friend void Display::displayItem(Values& value);
требуется для этой строчки
};
};
void displayItem(Values &value) //здесь ошибка
{ std::cout << value.m_intValue <<'\n'; }

8.

Лучшим решением было бы поместить каждое определение
класса в отдельный заголовочный файл с определениями
методов в соответствующих файлах .cpp. Таким образом, все
определения классов стали бы видны сразу во всех файлах .cpp.

9.

Задание
class Vector3D
{
private:
double m_x, m_y, m_z;
public:
Vector3D(double x = 0.0, double y = 0.0,
double z = 0.0) : m_x(x), m_y(y), m_z(z)
{ }
void print()
{
std::cout << "Vector(" << m_x << " , "
<< m_y << " , " << m_z << ")\n";
}
};
class Point3D
{
private:
double m_x, m_y, m_z;
public:
Point3D(double x = 0.0, double y = 0.0,
double z = 0.0) : m_x(x), m_y(y), m_z(z)
{ }
void print()
{
std::cout << "Point(" << m_x << " , "
<< m_y << " , " << m_z << ")\n"; }
void moveByVector(const Vector3D &v)
{ //реализуйте метод }
};
Сделайте метод Point3D::moveByVector() дружественным классу Vector3D.

10.

int main()
{
Point3D p(3.0, 4.0, 5.0);
Vector3D v(3.0, 3.0, -2.0);
p.print();
p.moveByVector(v);
p.print();
return 0;
}
English     Русский Правила