samat
|
Samat
|
|
|
|
Рег.: 05.01.2008
|
Сообщений: 445
|
Из: ГЗ-Б
|
Рейтинг: 69
|
|
[C++] Friends, forward declarations & invalid uses of incomplete types
23.05.2009 01:50
|
|
|
Хочется объявить в классе А protected переменную, после чего сделав функцию из класса Б ее другом получить из этой функции доступ к той самой переменной. Ну вроде так:
code: 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ем специальном издании) - тепло, но не разобрался, прогу сдавать сегодня днем. Вопрос: существует ли адекватная конструкция, позволяющая проделать вышеописанную махинацию?
|
|
l0st
|
ГосДеп
|
|
|
|
Рег.: 11.11.2005
|
Сообщений: 7673
|
|
Рейтинг: 3078
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: samat]
23.05.2009 02:07
|
|
|
На мой взгляд ты не должен этого хотеть. friend нарушает инкапсуляцию. А вообще в примере у тебя переменная принадлежит экземпляру, а не самому классу. Ты static не забыл?
|
коммунист |
|
samat
|
Samat
|
|
|
|
Рег.: 05.01.2008
|
Сообщений: 445
|
Из: ГЗ-Б
|
Рейтинг: 69
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: l0st]
23.05.2009 02:24
|
|
|
Согласен; у меня задание - написать прогу, в которой есть перегруженные функции-друзья. Вот и развлекаюсь.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: samat]
23.05.2009 02:27
|
|
|
Причем тут вообще protected? friend? до описания нельзя полями пользоваться. Можно делать только некоторые вещи, к примеру объявить указатель/ссылку на A.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: samat]
23.05.2009 02:29
|
|
|
Quote:
перегруженные функции-друзья.
code: struct A { friend void f(); friend void f(int); };
done
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: l0st]
23.05.2009 02:31
|
|
|
Quote:
friend нарушает инкапсуляцию.
Это неправда.
|
|
samat
|
Samat
|
|
|
|
Рег.: 05.01.2008
|
Сообщений: 445
|
Из: ГЗ-Б
|
Рейтинг: 69
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: unkulunkulu]
23.05.2009 02:31
|
|
|
ага. Так и сделаю.
Спокойной ночи, друзья.
|
|
Druxa
|
Дрюха
|
|
|
|
Рег.: 27.06.2003
|
Сообщений: 2722
|
Из: Троицк
|
Рейтинг: 1974
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: unkulunkulu]
23.05.2009 14:11
|
|
|
> struct A { friend void f(); friend void f(int); }; //done все правильно, какие задания такие и решения задание "написать программу с использованием iostream". решение
code:
#include <iostream>
int main () {return 0;}
=) никогда не понимал чего преподы пытаются такими заданиями добиться...
|
нет, я не богат... я сказочно не богат... но я и не умен... |
|
JUnit
|
|
|
|
|
Рег.: 08.03.2005
|
Сообщений: 3812
|
Из: Беляево
|
Рейтинг: 1621
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: Druxa]
23.05.2009 15:57
|
|
|
В main() за тебя компилятор "return 0;" допишет, зачем столько лишней ручной работы...
|
|
Yorik
|
|
|
|
|
Рег.: 01.09.2005
|
Сообщений: 2476
|
Из: Москва
|
Рейтинг: 633
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: JUnit]
23.05.2009 16:06
|
|
|
вот после таких и нервничаешь, собирая 10ую библиотеку, когда она выдает кучу warning'ов
|
|
JUnit
|
|
|
|
|
Рег.: 08.03.2005
|
Сообщений: 3812
|
Из: Беляево
|
Рейтинг: 1621
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: Yorik]
23.05.2009 16:11
|
|
|
|
Yorik
|
|
|
|
|
Рег.: 01.09.2005
|
Сообщений: 2476
|
Из: Москва
|
Рейтинг: 633
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: JUnit]
23.05.2009 16:19
|
|
|
я не про этот случай, я про "лишнюю ручную работу"
|
|
Druxa
|
Дрюха
|
|
|
|
Рег.: 27.06.2003
|
Сообщений: 2722
|
Из: Троицк
|
Рейтинг: 1974
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: JUnit]
23.05.2009 18:35
|
|
|
Quote:
за тебя компилятор "return 0;" допишет
кстати в C++ да, а вот в C - нет
code:
[andrei@xoft ~]$ cat main_no_return.c
int main(){}
[andrei@xoft ~]$ gcc -O3 -o main_no_return main_no_return.c
[andrei@xoft ~]$ ./main_no_return; echo $?
96
так что я как-то привык ему такие вещи не доверять
|
нет, я не богат... я сказочно не богат... но я и не умен... |
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: Druxa]
23.05.2009 21:36
|
|
|
Кстати! У меня телепат-мод проснулся! Мне кажется, что просили с дружественными перегруженными операторами, а не просто функциями сделать.
|
|
samat
|
Samat
|
|
|
|
Рег.: 05.01.2008
|
Сообщений: 445
|
Из: ГЗ-Б
|
Рейтинг: 69
|
|
Re: [C++] Friends, forward declarations & invalid uses of incomplete t
[re: unkulunkulu]
23.05.2009 23:31
|
|
|
Чуть-чуть не попал.Quote:
Формальная часть задания: 1й класс - независимый, должен содержать указатель (int*, char* или другой). Класс должен быть абстрактным. Для этого класса должны быть определены: конструктор, конструктор копирования, деструктор, оператор присваивания.
2й и 3й классы - наследники 1-го класса.
Должны использоваться 4 (минимум) перегруженных функции, включая какой-либо унарный оператор и хотя бы один бинарный оператор. Некоторые из функций должны быть перегружены как члены класса, некоторые - как друзья класса.
В классах должны быть определены виртуальные функции. Они должны использоваться в программе.
В программе присутствует функция main, в которой объекты создаются и взаимодействуют. Пользователь должен иметь возможность видеть результат создания и взаимодействия объектов (информация о выполненных действиях должна печататься на экран).
|
|