C ++ доступ к объектам далеко от текущей иерархии классов - PullRequest
2 голосов
/ 30 сентября 2011

Я думаю, что это действительно новый вопрос, но я так и не нашел ответа. Я не знаю, как именно сформулировать этот вопрос, но я часто нахожу, что мне нужно получить доступ к объектам, которые находятся «далеко» от текущего объекта с точки зрения текущей иерархии. Я просто хочу убедиться, что это правильный (единственный) способ сделать это.

Это также относится к передаче параметров из основного. Я считаю, что некоторые объекты, удаленные от основного, должны быть переданы с параметром несколько раз. Как объект, удаленный от основного, получает информацию из командной строки?

Например, для первого случая, для 4 классов ...

class A{
   B b;
   //need to check status of D

   //choice 1
   b.get_c().get_d().get_status();  

   //choice 2
   const C& c = b.get_c();
   const D& d = c.get_d();
   d.get_status();
};

class B{
public:
   C c;
   const C& get_c() {return c;}
};

class C{
public:
   D d;
   const D& get_d() {return d;}
};

class D{
public:
   bool check_status();
};

Скажите что-то вроде: A - это машина, B - это дверная сборка, C - это дверь, D - это замок. Затем А должен проверить, скажем, заблокирован ли, иначе предотвратить запуск.

Вариант 3 - напрямую вызвать метод D из A, мне нужно сделать несколько слоев check_status () в C, B и A и вернуть D, C, B.check_status ().

Разве все эти вызовы подобъектов (если код был немного сложнее) не требуют много времени?

Спасибо.

Ответы [ 5 ]

1 голос
/ 30 сентября 2011

Ответ на этот вопрос всегда один и тот же: не беспокойтесь об этом до тех пор, пока это не станет проблемой, а затем проведите измерения, чтобы решить, какой вариант лучше.Да, есть издержки с вызовами подобъектов, но в приведенном вами примере (и со многими реальными примерами) эти издержки неизбежны (и компилятор может оптимизировать некоторые из них в любом случае).

1 голос
/ 30 сентября 2011

Все эти функции являются встроенными, поскольку они объявлены в определении класса, и являются простыми return something;.Они возвращают ссылки, поэтому в них нет никаких копий (обратите внимание, что они, вероятно, должны быть const функциями-членами, иначе я не вижу, как ваш код будет компилироваться).Не должно быть никаких накладных расходов, я бы порекомендовал вам скомпилировать код и взглянуть на сгенерированную сборку, чтобы быть уверенным.

0 голосов
/ 30 сентября 2011

Относительно производительности вызова функции, связанной с цепочкой, как у вас, в наши дни не нужно сильно беспокоиться, когда функции возвращают простые ссылки на константы.

Однако, как возможный недостаток дизайна, вы обычно должны работатьс непосредственными объектами и избегайте углубления в данные другого объекта.Образно говоря, когда вы хотите узнать, когда у вашего торговца снова появится товар, вы спрашиваете его напрямую (time = merchant.Availability(product);) и не спрашиваете его о дате прибытия товара (time = merchant. GetSupplyerForProduct(product). SupplySchedule(). NextArrival();)

0 голосов
/ 30 сентября 2011

В дополнение к ответам, приведенным выше, получение копии Large Scale C ++ Software Design может помочь в этом отношении. Не беспокойтесь, что первая глава немного неактуальна в наши дни, большинство представленных идей все еще применимы.

0 голосов
/ 30 сентября 2011

Ну, для симметы вы можете поместить в A a const B& get_b() const и сделать

get_b().get_c().get_d().get_status();

Два варианта выбора полностью эквивалентны (и оптимизация компилятора может фактически дать идентичный код).

Единственное предложение - объявить получатели как const X& get_x() const, так как они не изменяют владельца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...