2016-09-27 6 views
0

Я прочитал в this вопрос, чтоКруговые Зависимости между классами C++

Если у вас действительно есть модель, где А содержит B и B содержит А, то эти классы кажутся неспособными жить друг без друга. В этом случае, возможно, у вас действительно есть только один класс, а не два.

Что бы так быть, если А может содержать B, но B всегда должны иметь ссылку на А (В не может существовать без)?

Чтобы проиллюстрировать, существует класс Куба, который может содержать объект класса Collider (IE: другие кубы с коллайдерами должны сталкиваться с ним).

class Cube 
{ 
public: 
    Cube(); 
    ~Cube(); 

    Collider collider; //Optional Collider 
} 

class Collider 
{ 
public: 
    Collider(Cube & parentReference) : parent(parentReference) {} 

private: 
    Cube & parent; 
} 

В случае, например, как это, где куб и коллайдер должен действительно быть два отдельных классов, как можно избежать циклических зависимостей в то же время иметь возможность хранить ссылку на куб в коллайдере?

Редактировать: на этот вопрос с этого момента никто не ответил. Тем не менее, кто-то достаточно любезен, чтобы сообщить мне, почему этот вопрос был занижен, так что я бы изменил то, как я прошу в будущем? Дублирование? Не хватает информации? Слишком много вопросов начинающих? Дайте мне знать :)

+0

В вашем 'class Cube' я либо использовал бы' Collider * collider', и проверил бы его на null, либо использовал 'boost :: optional optionalCollider'. – AlexanderS

+0

В любом случае, не должны ли оба коллайдера и класса куба включать заголовки друг друга? Разве это не приведет к циклическим зависимостям? – Sam

+0

Да, но так как стико написал в ответе ниже, вы можете добавить декларацию вперед, чтобы исправить вопрос о движении кругового движения. – AlexanderS

ответ

3
class Collider; 

class Cube 
{ 
public: 
    Collider* collider; //Optional Collider 
} 

class Collider 
{ 
public: 
    Collider(Cube & parentReference) : parent(parentReference) {} 

private: 
    Cube & parent; 
} 

Объявите о существовании Коллайдера и определите его позже. C (++) позволяет указателям на неполные типы. Адрес more info about forward declaration.

+0

Это прояснило мое сомнение, спасибо! – Sam

0

Вы можете сделать предварительную декларацию. См. wikipedia и this question.

Код для вашего примера см. Ответ от @Ivan Rubinson.

+1

Почему downvote? Должен ли я просто прокомментировать ответ Ивана Рубинсона, чтобы добавить название «форвардная декларация»? – styko

+0

Я очень смущен и расстроен с помощью downvotings как в последнее время. Люди должны, по крайней мере, позволить плакатам знать, почему. Спасибо за помощь! – Sam

+0

Я думаю, это потому, что ваш ответ короткий и не хватает вещества? SO сообщество может быть жестким время от времени. –

Смежные вопросы