Типы взаимного возврата функций-членов (C++)

Возможно ли в C++ иметь два класса, назовем их A и B, так что A имеет функцию-член f, возвращающую объект класса B, а B имеет функцию-член g, возвращающую объект класса A?

(Текст ниже просто показывает, что я "сделал домашнее задание".)

Проблема только в том, как написать сигнатуры этих функций, когда функция в первом определенном классе будет иметь неполный возвращаемый тип. Форвардные объявления здесь не помогают, потому что объекты возвращаются по значению.

Да, я знаю все обходные пути (дружеские глобальные функции, возврат по указателю,...), но я просто хотел бы знать, можно ли реализовать описанный выше интерфейс на C++. В качестве примера предположим, что я пытаюсь перегрузить оператор() для класса A, чтобы он возвращал B, и для класса B, чтобы возвращать A. Так как я перегружаю операторы, я должен возвращать значение (ну, если я не хочу динамического распределения, черт возьми:), а () должен быть перегружен как функция-член, поэтому я не могу использовать глобальных друзей.


person Veky    schedule 21.05.2011    source источник


Ответы (2)


Да, реализовать определения функций class A после того, как вы объявили class B

class B;

class A
{
    B f();
};

class B
{
    A g() { A a; return a; }
};

B A::f(){ B b; return b; }
person cpx    schedule 21.05.2011
comment
Прототипы/объявления функций не нуждаются в полностью определенных типах? Хорошо знать! - person Xeo; 21.05.2011

Другой возможный способ разорвать цикл зависимости — использовать функцию-член шаблона, например:

struct A {
    template<typename T>  T f() { return T(); }
};

struct B {
    A g() { return A(); }
};

int main() {
    A a;
    B b = a.f<B>();
    A a1 = b.g();
    return 0;
}

Это будет работать и для operator(), хотя синтаксис вызова будет довольно уродливым: a.operator()<B>()

person Alexey Kukanov    schedule 21.05.2011