Взаимные возвращаемые типы функций-членов (C ++) - PullRequest
4 голосов
/ 21 мая 2011

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

(текст ниже только для того, чтобы показать, что я «сделал домашнее задание».)

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

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

Ответы [ 2 ]

7 голосов
/ 21 мая 2011

Да, реализовать определения функций 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; }
0 голосов
/ 21 мая 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>()

...