[C++] Friends, forward declarations & invalid uses of incomplete types

Nikas

Хочется объявить в классе А protected переменную, после чего сделав функцию из класса Б её другом получить из этой функции доступ к той самой переменной.
Ну вроде так:
class A;
class B{
public:
void foo{printf("%d\n",i);};
};
class A{
protected:
int i;
friend void B::foo;
};

По понятным причинам сделать это не удаётся.
Нарыл в стауструпе 11.5.1 (280 стр. в английском 3ем специальном издании) — тепло, но не разобрался, прогу сдавать сегодня днём.
Вопрос: существует ли адекватная конструкция, позволяющая проделать вышеописанную махинацию?

agaaaa

На мой взгляд ты не должен этого хотеть. friend нарушает инкапсуляцию.
А вообще в примере у тебя переменная принадлежит экземпляру, а не самому классу. Ты static не забыл?

Nikas

Согласен; у меня задание — написать прогу, в которой есть перегруженные функции-друзья.
Вот и развлекаюсь.

Serab

Причем тут вообще protected? friend? до описания нельзя полями пользоваться. Можно делать только некоторые вещи, к примеру объявить указатель/ссылку на A.

Serab

перегруженные функции-друзья.
struct A { friend void f; friend void f(int); };
done

Serab

friend нарушает инкапсуляцию.
Это неправда.

Nikas

ага.
Так и сделаю.
Спокойной ночи, друзья.

rosali

> struct A { friend void f; friend void f(int); }; //done
всё правильно, какие задания такие и решения :)
задание "написать программу с использованием iostream". решение

#include <iostream>
int main {return 0;}

=) никогда не понимал чего преподы пытаются такими заданиями добиться...

enochka1145

В main за тебя компилятор "return 0;" допишет, зачем столько лишней ручной работы...

klyv

вот после таких и нервничаешь, собирая 10ую библиотеку, когда она выдаёт кучу warning'ов

enochka1145

Это по стандарту.

klyv

я не про этот случай, я про "лишнюю ручную работу"

rosali

за тебя компилятор "return 0;" допишет
кстати в C++ да, а вот в C - нет

[xoft ~]$ cat main_no_return.c
int main{}

[xoft ~]$ gcc -O3 -o main_no_return main_no_return.c

[xoft ~]$ ./main_no_return; echo $?
96

так что я как-то привык ему такие вещи не доверять :)

Serab

Кстати! У меня телепат-мод проснулся! Мне кажется, что просили с дружественными перегруженными операторами, а не просто функциями сделать.

Nikas

Чуть-чуть не попал.

Формальная часть задания: 1й класс — независимый, должен содержать указатель (int*, char* или другой). Класс должен быть абстрактным. Для этого класса должны быть определены: конструктор, конструктор копирования, деструктор, оператор присваивания.¶
2й и 3й классы — наследники 1-го класса.¶
Должны использоваться 4 (минимум) перегруженных функции, включая какой-либо унарный оператор и хотя бы один бинарный оператор. Некоторые из функций должны быть перегружены как члены класса, некоторые — как друзья класса.¶
В классах должны быть определены виртуальные функции. Они должны использоваться в программе.¶
В программе присутствует функция main, в которой объекты создаются и взаимодействуют. Пользователь должен иметь возможность видеть результат создания и взаимодействия объектов (информация о выполненных действиях должна печататься на экран).¶
Оставить комментарий
Имя или ник:
Комментарий: