Классы с дружественными функциями друг друга

#c #friend #forward-declaration

#c #друг #forward-объявление

Вопрос:

Возможно ли создать класс, который имеет дружественную функцию прямого объявленного класса? Если бы я хотел создать два класса, которые имеют дружественные функции друг друга, как бы я это сделал? Эта попытка завершается неудачей с сообщением invalid use of incomplete type 'class Y' :

 class Y;

class X
{
public:
    void a();
    friend void Y::b();
};

class Y
{
public:
    void b();
    friend void X::a();
};
  

Я также попробовал прямое объявление void Y::b(); сразу после class Y; чего аналогично не сработало. Будет ли этот пример показателем плохого дизайна с моей стороны или просто ограничением C ?

Комментарии:

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

2. Сделайте либо класс Y другом класса X, либо наоборот. Насколько я знаю, C этого не допускает. Кстати, несколько подозрительно, что вам нужна двунаправленная дружба. Возможно, вы захотите пересмотреть свой дизайн.