Предполагая, что это что-то простое, приведенный выше комментарий Адама Михальчина верен в том смысле, что на него отвечает аналогичный вопрос. Но я все равно закодирую.
Предполагая, что у вас есть это (определения методов не имеют значения):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
Затем вы можете, как сказал Адам, просто перенаправить все 3 из них следующим образом:
class A;
class B;
class C;
И поместите этот блок над всеми тремя из них. Однако здесь важно то, что это когда есть указатели на другие классы, а не композиция, где они являются частью класса. Вы можете использовать прямое объявление, чтобы обеспечить правильную компиляцию при работе с указателями, но не с другими типами данных. Итак, если бы было это:
class D
{
B myB;
}
Со всем остальным, как указано выше, вам нужно будет иметь «настоящее» определение для B выше «настоящего» определения для D. Но остальное может быть таким же. Форвардное объявление «работает» только для указателей.
Однако вы ДОЛЖНЫ разорвать цикл зависимости где-нибудь с помощью указателя. Если указателя никогда нет, то структура данных «бесконечна» и, следовательно, не работает. Это потому, что в моем примере D всегда содержит B. Но что, если A всегда содержит B, B всегда содержит C, а C всегда содержит A? Ну, этому финальному А нужен еще один Б, которому нужен еще один В, который... Надеюсь, вы уловили идею. Но с указателями вы можете зациклить это. С композицией (не указателями) он не может зацикливаться.
person
Kevin Anderson
schedule
10.04.2012