Взаимные классы C ++, объявленные внутри функции - PullRequest
0 голосов
/ 16 декабря 2010

Как определить классы внутри функции, чтобы они «знали» друг о друге?Вот очень глупая версия того, что я пытаюсь понять.Я хотел бы сделать что-то вроде:

void foo () {

    struct A {
        static void bar () {
            B::hmm();
        }
    };

    struct B {
        static void hmm () {
            A::bar();
        }
    }
}

Это не работает, потому что A :: bar () еще ничего не знает о B.Вне функции я мог отложить определение A :: bar () до объявления B.Что-то вроде:

void foo () {

    struct A {
        static void bar ();
    };

    struct B {
        static void hmm () {
            A::bar();
        }
    }

    void A::bar () {
        B::hmm();
    }
}

Но, похоже, это не работает внутри функции.

Вместо некоторого умного объявления области видимости, которое делает все это работающим, я также приветствовал быокончательный ответ, говорящий, что это просто невозможно в C ++ (ссылка, пожалуйста).

Я знаю, что есть другие способы обойти это (например, объявление классов вне foo), поэтому я не ищуответы о том, как сделать нечто подобное ...

1 Ответ

3 голосов
/ 16 декабря 2010

Вы не.

Функции-члены локальных классов должны быть определены внутри определения класса.

Поскольку определения A::bar() и B::hmm() являются взаимозависимыми и поскольку функции-члены не могут быть заранее объявлены вне определения класса, нет способа упорядочить определения так, чтобы это могло работать.

(Вы сказали, что не ищете обходных путей, но я все равно скажу, что, по моему мнению, определение любого удаленно сложного класса, более или менее нескольких классов внутри определения функции, затрудняет читабельность кода и является плохим идея.)

...