При переходе с C# на C++ я получаю много рекомендаций по использованию семантики значений, где это возможно. Практически гарантировано, что если я отправлю вопрос с указателем в любом месте, кто-нибудь придет и предложит вместо этого значение. Я начинаю прозревать, и я нашел много мест в своем коде, где я мог бы заменить динамическое распределение и указатели переменными, размещенными в стеке (и обычно ссылками). Итак, я думаю, что понял, как использовать объекты, выделенные в стеке, и передавать их другим функциям в качестве ссылок, когда время жизни объекта у вызывающего больше, чем у вызываемого.
Однако у меня есть вопрос о передаче объектов по значению, когда вызываемый объект станет владельцем. Возьмем следующий пример:
class Zoo
{
void AddAnimal(Animal animal);
std::list<Animal> animals_;
}
Как правило, с точки зрения гибкости и модульного тестирования я бы хотел, чтобы Animal был интерфейсом (абстрактным классом в C++), чтобы я мог легко отправлять произвольных животных и издеваться над ними с помощью фиктивной реализации.
В реализации указателя клиентский код будет вызывать это так:
Animal animal = new Lion("Bob");
myZoo.AddAnimal(animal);
Здесь клиентскому коду действительно не нужен объект животного. Он просто создает его временно, чтобы перейти к методу. Так что в этом случае нет общей семантики. Так что это хороший случай для семантики значений. Однако я понимаю, что вы не можете использовать Animal в качестве параметра, передаваемого по значению, потому что это абстрактный класс.
Большинство моих функций-членов, которые не принимают примитивные типы, принимают параметры абстрактного класса. Итак, каков метод С++ для решения этой проблемы? (Вот как вы программируете интерфейсы на C++ с семантикой значений?)
Animal
должно бытьAnimal*
- person David Rodríguez - dribeas   schedule 09.11.2011