powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Доступ к дружественным функциям внутри класса
4 сообщений из 4, страница 1 из 1
Доступ к дружественным функциям внутри класса
    #38250366
pol_ar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кто-то любит разгадывать загадки синтаксиса С++ на нашем форуме, то вот два вопроса по использованию дружественных функций. Рассмотрим классический пример из википедии ( http://en.wikipedia.org/wiki/Friend_function), слегка мной измененный.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#include <iostream> // cout
using namespace std;

class test8B; class test8A; // предварительное определение классов для функции FriendlyFunction
void FriendlyFunction(test8A& x, test8B& y); // глобальная функция для объявления дружественной в других классах

class test8B // сначала независимый класс
{
public: // в оригинальном примере член класса был объявлен как private
//private:
	int frnd2;
public:
	test8B() { frnd2 = 82; }
	void FriendlyFunction(test8A& x, test8B& y);
};

class test8A // потом зависимый
{
public: // в оригинальном примере член класса был объявлен как private
//private:
	int frnd1;
public:
	test8A() { frnd1 = 81; }
	void FriendlyFunction(test8A& x, test8B& y)
	{
		cout << "Собственная функция из класса test8A, " << x.frnd1 << " | " << y.frnd2 << endl;
	}
             // две дружественные функции, доступ к ним надо получить
	friend void ::FriendlyFunction(test8A& x, test8B& y); // declaration of global friend
	friend void test8B::FriendlyFunction(test8A& x, test8B& y); // declaration of friend from other class 
};

void FriendlyFunction(test8A& x, test8B& y) // используемые классы должны быть объявлены ранее
{
	cout << "Глобальная дружественная функция, " << x.frnd1 << " | " << y.frnd2 << endl;
}

void test8B::FriendlyFunction(test8A& x, test8B& y)
{
	cout << "Дружественная функция из класса test8B, " << x.frnd1 << " | " << y.frnd2 << endl;
}

test8A t7;
test8B t8;
FriendlyFunction(t7,t8); // Глобальная дружественная функция
t7.FriendlyFunction(t7,t8); // Собственная функция из класса test8A
t8.FriendlyFunction(t7,t8); // Дружественная функция из класса test8B
t8.test8B::FriendlyFunction(t7,t8); // Дружественная функция из класса test8B



Вывод:

Глобальная дружественная функция, 81 | 82
Собственная функция из класса test8A, 81 | 82
Дружественная функция из класса test8B, 81 | 82
Дружественная функция из класса test8B, 81 | 82


Теперь вопросы:
1. Почему переменные frnd1 и frnd2 теперь приходится объявлять публичными? В противном случае возникает ошибка, например: "test8B::frnd2: невозможно обратиться к private член, объявленному в классе "test8B".
2. Можно ли обратиться к двум функциям в классе test8A, которые объявлены как дружественные, и как это сделать.
3. В чем смысл использования дружественной функции, если можно наследовать класс? Предполагаю, что экономится память. Тогда насколько много экономится и как посчитать этот эффект?
...
Рейтинг: 0 / 0
Доступ к дружественным функциям внутри класса
    #38250714
friend class test8A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В вашем примере в class test8A можно и private оставить.

А чтобы и в class test8B можно было использовать private добавьте две строчки:
Код: plaintext
1.
2.
    friend void ::FriendlyFunction(test8A& x, test8B& y); // declaration of global friend
    friend class test8A; // friend void test8B::FriendlyFunction(test8A& x, test8B& y); 

Как вместо дружественного класса дружественную функцию тут использовать сам чето сходу не понял.

В итоге:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#include <iostream> // cout
using namespace std;

class test8B; class test8A; // предварительное определение классов для функции FriendlyFunction
void FriendlyFunction(test8A& x, test8B& y); // глобальная функция для объявления дружественной в других классах

class test8B // сначала независимый класс
{
//public: // в оригинальном примере член класса был объявлен как private
private:
    int frnd2;
public:
	test8B() { frnd2 = 82; }
	void FriendlyFunction(test8A& x, test8B& y);
    friend void ::FriendlyFunction(test8A& x, test8B& y); // declaration of global friend
    friend class test8A; // friend void test8B::FriendlyFunction(test8A& x, test8B& y); 
    
};

class test8A // потом зависимый
{
//public: // в оригинальном примере член класса был объявлен как private
private:
	int frnd1;
public:
	test8A() { frnd1 = 81; }
	void FriendlyFunction(test8A& x, test8B& y)
	{
		cout << "Собственная функция из класса test8A, " << x.frnd1 << " | " << y.frnd2 << endl;
	}
             // две дружественные функции, доступ к ним надо получить
	friend void ::FriendlyFunction(test8A& x, test8B& y); // declaration of global friend
	friend void test8B::FriendlyFunction(test8A& x, test8B& y); // declaration of friend from other class 
};

void FriendlyFunction(test8A& x, test8B& y) // используемые классы должны быть объявлены ранее
{
	cout << "Глобальная дружественная функция, " << x.frnd1 << " | " << y.frnd2 << endl;
}

void test8B::FriendlyFunction(test8A& x, test8B& y)
{
	cout << "Дружественная функция из класса test8B, " << x.frnd1 << " | " << y.frnd2 << endl;
}

int main() {
    test8A t7;
    test8B t8;
    FriendlyFunction(t7,t8); // Глобальная дружественная функция
    t7.FriendlyFunction(t7,t8); // Собственная функция из класса test8A
    t8.FriendlyFunction(t7,t8); // Дружественная функция из класса test8B
    t8.test8B::FriendlyFunction(t7,t8); // Дружественная функция из класса test8B
    
    return 0;
}
...
Рейтинг: 0 / 0
Доступ к дружественным функциям внутри класса
    #38250739
friend class test8A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Единственное нагуглилось, тут обсуждали forward declaration для friend функции, но ничего умного не сказали. Наверно нельзя.
http://ubuntuforums.org/showthread.php?t=737977
...
Рейтинг: 0 / 0
Доступ к дружественным функциям внутри класса
    #38250983
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pol_ar1. Почему переменные frnd1 и frnd2 теперь приходится объявлять публичными? В противном случае возникает ошибка, например: "test8B::frnd2: невозможно обратиться к private член, объявленному в классе "test8B".

Потому что у класса test8B нет друзей, а к его приватному полю frnd2 идет обращение из внешних функций.
pol_ar2. Можно ли обратиться к двум функциям в классе test8A, которые объявлены как дружественные, и как это сделать.

А то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void FriendlyFunction(test8A& x, test8B& y)
{
	cout << "Собственная функция из класса test8A, " << x.frnd1 << endl;
	::FriendlyFunction(x, y); // Глобальная дружественная функция
	test8B b;
	b.FriendlyFunction(x, y);// Дружественная функция из класса test8B
}

pol_ar3. В чем смысл использования дружественной функции, если можно наследовать класс? Предполагаю, что экономится память. Тогда насколько много экономится и как посчитать этот эффект?
Зачем пользоваться молотком, если можно воспользоваться обухом топора? Это два принципиально разных приема,
и назначение у них разное.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Доступ к дружественным функциям внутри класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]