2016-12-23 2 views
1

Скажем, у меня есть два класса:дизайна для доступа к элементам владельца объекта

Class A { 
    B b; 
    Foo bar; 
} 

Class B { 
// some stuff 
} 

Поскольку объект типа А имеет объект типа B, некоторые вещи из B может быть доступна А. Что бы хороший дизайн, если объект типа B должен иметь доступ к его собственному объекту (типа A)? Например. если у меня есть объект типа B и вы хотите получить значение бара объекта, членом которого он является.

Было бы хорошей практикой добавлять ссылку на A до B каждый раз, когда создается B или какой-либо шаблон делегата?

+0

Я ответил, но я не думаю, что он соответствует требованиям. Но не могли бы вы более подробно остановиться на них? Продвигайтесь заранее, добросовестно. – Bathsheba

+0

В принципе, если у меня есть объект типа B, я хочу спросить его: «У вас есть хозяин? И если да, то что его значение« бар »? Мне нужен элегантный способ сказать объект типа B, к которому принадлежит A. – Kackao

ответ

0

Обычный способ будет использовать родительский указатель в своем классе B:

class A { 
A():b(this){} 
B b; 
Foo bar; 
}; 

class B { 
B(A *parent=0) 
:p_parten(parent){} 
// some stuff 
void func(){ 
    if (p_parent) 
     p_parent->bar.something(); 
} 
A *p_parent; 
}; 
0

Да, просто хотите передать ссылку или указатель на A в конструктор B.

0

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

Если это минимизированная версия чего-то, что вы будете использовать в большом проекте, я бы посоветовал вам подумать, почему B нуждается в A, поскольку A кажется вашим менеджером. И переместите эту разделяемую часть A в отдельный класс, позвоните ей C, а затем перейдите на C в B. A.

Если у вас есть проблемы с включением, используйте «forward declaration» для объявления A в файле заголовка B.

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