Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> friend class, нужно ли forward declaration? 
V
    Опции темы
_GRIN_
Дата 2.12.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 1
Всего: 7



Преамбула - всегда объявлял друзей класса прям в тебе класса без всякого forward declartion:
Код

class MyClass
{
firiend class MyFriendClass;
... some data ...
};

В основном использовал "друзей" для юнит-тестов

Недавно коллега увидел это (мы с ним фэйл в юнит-тесте разбирали) и сказал, что так (без forward declaration) по стандарту работать не должно.
Я чутка погуглил, но ничего явно запрещающего или явно разрещающего использование "друзей" без форвард декларейшн  не нашёл.

Подскажите, где в стандарте искать данную инфу?
А то тут у нас холивар намечается =)


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
rumit7
Дата 2.12.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(_GRIN_ @ 2.12.2011,  13:38)
Подскажите, где в стандарте искать данную инфу?
А то тут у нас холивар намечается =)

C++ STANDARD-2003, раздел 11.4.9:

"For a friend class declaration, if there is no prior declaration, the class that is specified belongs to the innermost enclosing non-class scope, but if it is subsequently referenced, its name is not found by name lookup until a matching declaration is provided in the innermost enclosing nonclass scope."
PM MAIL   Вверх
newbee
Дата 2.12.2011, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Странный у тебя холивор намечается... Друх сказал тебе что-то с отсылкой на стандарт, так пусть же приведет пруф и тыкнет пальцем прямо в стандарт.

Я холиворить с тобой не собираюсь, поэтому пруфы искать не буду, но скажу: по стандарту то, что указано во friend является декларацией, в т.ч. может быть и форвард дефларацией. Единственая проблема с форвард-декларацией может быть, когда ты френдишь классы из разных нэймспейсов, там есть какой-то замут, связанный с тем, что неизвестный до сих пор символ будет забинден в текущей неймспейс, т.е. френдить класс из другого неймспейса предварительно не задикларировав его нельзя.


--------------------
You're face to face
With man who sold the world
PM   Вверх
rumit7
Дата 2.12.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(rumit7 @ 2.12.2011,  14:06)
Цитата(_GRIN_ @ 2.12.2011,  13:38)
Подскажите, где в стандарте искать данную инфу?
А то тут у нас холивар намечается =)

C++ STANDARD-2003, раздел 11.4.9:

"For a friend class declaration, if there is no prior declaration, the class that is specified belongs to the innermost enclosing non-class scope, but if it is subsequently referenced, its name is not found by name lookup until a matching declaration is provided in the innermost enclosing nonclass scope."

Код

namespace N
{    
    class A
    {
        friend class B;
    private:    
        static int value;
    };
}

//namespace N
//
    class B
    {
    public:
        void f()
        {
            N::A::value = 10;    // compilation error: ‘int N::A::value’ is private
        }
    };
//}


Раскомментируйте и ошибка компиляции исчезнет.
PM MAIL   Вверх
newbee
Дата 2.12.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Вот rumit7 умничка написал кодом про неймспейсы то, что я вылила в потоке сознания )))


--------------------
You're face to face
With man who sold the world
PM   Вверх
rumit7
Дата 2.12.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(newbee @ 2.12.2011,  14:28)
Вот rumit7 умничка написал кодом про неймспейсы то, что я вылила в потоке сознания )))

 smile 
..только вот у Вас как всегда лучше получилось..
PM MAIL   Вверх
baldina
Дата 2.12.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



решаемо
Код

class B;

namespace N
{    
    class A
    {
        friend class ::B;
    private:    
        static int value;
    };
}

class B
{
  public:
  void f() {
    N::A::value = 10;
  }
};


PM MAIL   Вверх
newbee
Дата 2.12.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(baldina @  2.12.2011,  18:37 Найти цитируемый пост)
решаемо
Ты руками сделал форвард-декларацию, так нечестно, топик о другом.


--------------------
You're face to face
With man who sold the world
PM   Вверх
baldina
Дата 3.12.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



форвард есть, сжульничал. хотел показать что к глобальному namspace доступ можно получить
PM MAIL   Вверх
_GRIN_
Дата 8.12.2011, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 1
Всего: 7



baldina, gcc твой пример не компилит - гляди лог:

исходник:
Код

//tst_friend_namespace.cpp 
class B;

namespace N
{    
    class A
    {
        friend class ::B;
    private:    
        static int value;
    };
}

class B
{
  public:
  void f() {
    N::A::value = 10;
  }
};

int main(int,char**)
{
    B obj_b;
    obj_b.f();
    return 0;
}


попытка компиляции:
Код

grin@grinnote:~/1_work/research/tst_friend_namespace$ g++ tst_friend_namespace.cpp 
/tmp/ccMbarYk.o: In function `B::f()':
tst_friend_namespace.cpp:(.text._ZN1B1fEv[B::f()]+0x5): undefined reference to `N::A::value'
collect2: ld returned 1 exit status


Код

gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 


Но если работать не со статик-переменными, то всё работает =)
Код

#include <stdio.h>

class B;

namespace N
{    
    class A
    {
        friend class ::B;
    private:    
        int m_value;
    };
}

class B
{
public:
  void setValue(N::A*obj_a,int val)const
  {
    obj_a->m_value = val;
  }
  int value(const N::A*obj_a)const
  {
    return obj_a->m_value;
  }
};

int main(int,char**)
{
    N::A obj_a;
    B obj_b;
    obj_b.setValue(&obj_a,30);
    printf("%d\n",obj_b.value(&obj_a));
    return 0;
}


Это сообщение отредактировал(а) _GRIN_ - 8.12.2011, 04:06


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
_GRIN_
Дата 8.12.2011, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 1
Всего: 7



rumit7, спасибо за ссылку в стандарте =)

newbee, и тебе спасибо

baldina, и тебе =)

Тема закрыта


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
baldina
Дата 8.12.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(_GRIN_ @  8.12.2011,  03:51 Найти цитируемый пост)
baldina, gcc твой пример не компилит

ну так саму переменную где-то определить надо
http://liveworkspace.org/code/fadab919a60a...8789c3d6b4e8c83
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.