Как объявить структуру A, содержащую экземпляры класса B, где у класса B есть функции, возвращающие структуру A?

Я изо всех сил старался описать цель в заголовке, но вот она в коде:

struct Bar {
    Foo one;
    Foo two;
}

class Foo {
    Bar function();
}

Я знаю, что это не сработает, но как мне реализовать эту идею? Причина, по которой я хочу сделать структуру глобальной, заключается в том, что она также используется в main.cpp. Я уже пытался объявить структуру внутри класса, а затем определить структуру вне класса как Foo::Bar { }, но это тоже не работает.

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


person Brian    schedule 23.10.2011    source источник


Ответы (2)


Поскольку Bar содержит экземпляры Foo, последнее не может быть неполным в объявлении первого. Поэтому вам нужно объявить Foo перед объявлением Bar. Однако, поскольку Foo содержит функцию, которая возвращает объект Bar, вам придется предварительно объявить Bar перед объявлением Foo.

struct Bar;

class Foo {
    Bar function();
};

struct Bar {
    Foo one;
    Foo two;
};

Bar Foo::function()
{ 
  return Bar();
}

Обратите внимание, что фактическое определение Foo::function может появиться только после объявления Bar, так как функция должна создать экземпляр объекта Bar.

person Praetorian    schedule 23.10.2011
comment
Вы намеревались класс Бар; быть структурой Bar;? И да, это все в заголовочном файле, так что вся реализация после. - person Brian; 23.10.2011
comment
@ Суи Да, извини. Я исправил это. - person Praetorian; 23.10.2011

Вам просто нужно сделать переадресацию классов следующим образом:

class Foo;


struct Bar {
    Foo *one;
    Foo *two;
};

class Foo {
    struct Bar function();
};

Это объявляет класс без его фактического определения, что делает его пригодным для использования.

person Kurtis Nusbaum    schedule 23.10.2011
comment
Это не сработает. Прежде всего foo != Foo; C++ чувствителен к регистру. Кроме того, Bar содержит экземпляры Foo, а не указатели или ссылки на экземпляры, поэтому тип Foo не может быть неполным в объявлении Bar. - person Praetorian; 23.10.2011
comment
Когда я пытаюсь это сделать, я получаю ошибки: поле «один» имеет неполный тип, поле «два» имеет неполный тип (Изменить: что сказал преторианец) - person Brian; 23.10.2011
comment
Ах да @Praetorian, спасибо, что поймали это. Я исправил это. Sooie, пожалуйста, смотрите мое исправление. - person Kurtis Nusbaum; 23.10.2011
comment
Теперь он скомпилируется, но вы радикально изменили определение класса, возможно, @Sooie требуется Bar для содержания Foo экземпляров, и он не хочет выделять их динамически. - person Praetorian; 23.10.2011