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