Например,
У меня есть класс генератора учетных записей, которому нужен случайный метод для определения имени пользователя и пароля. Random имеет много способов реализации, поэтому это интерфейс со многими подклассами. Класс генератора учетных записей принимает случайный объект в конструкторе.
В Java нас не волнует удаление объекта. Но сейчас я делаю это на C++. Мой вопрос в том, если бы я сделал следующее в main()
Random random=new StdRandom();
AccGen accGen=new AccGen(random);
должен ли я удалить «случайный» в main () или я должен поместить его в деструктор AccGen?
Редактировать:
Даже после того, как на вопрос дан очень хороший ответ, я думаю, что все же могу указать причину, по которой я использую указатель, чтобы помочь кому-то, столкнувшемуся с той же проблемой.
Причина, по которой я использую указатель, заключается в применении многих шаблонов, таких как Factory и Behavior. Переменная без указателя, по-видимому, не может быть интерфейсом с чисто виртуальным методом, который не может представлять переопределения.
С точки зрения дизайна я думаю, что создатель объекта всегда несет ответственность за его удаление. Вот почему это приводит меня в замешательство. Все, что нужно вызывающей стороне, это объект AccGen. Я передал случайный объект, чтобы решить реализацию Random внутри AccGen. Тогда Random объект не является участником уровня вызывающего, тогда почему вызывающий должен нести ответственность за его удаление. Но дело в том, что рандом в некоторых случаях полезен в следующих действиях на уровне звонящего. Приведенный пример действительно просто пример.
После изучения интеллектуального указателя уникальный указатель действительно является решением моей проблемы. Это делает указатель более конкретным с точки зрения указания цели создания такого указателя.
Подводя итог, если объект полезен после передачи в конструктор, то тип будет чистым указателем и без удаления в деструкторе. Если объект бесполезен на уровне вызывающего объекта, то тип должен быть уникальным указателем.
new
— используйте интеллектуальные указатели, такие какstd::unique_ptr
илиstd::shared_ptr
. Таким образом, у вас будет четкое право собственности, и вам никогда не придется беспокоиться об удалении объектов. - person Yksisarvinen   schedule 13.11.2019AccGen
узнает, что указатель был создан при вызовеnew
? Вы могли бы дать ему адрес нераспределенного объекта, т. е.Random random; AccGen accGen(&random);
. Таким образом, вы не можете просто приравнять C++ к Java или попытаться выяснить, что делать с C++, учитывая, как работает Java. - person PaulMcKenzie   schedule 13.11.2019using Random = StdRandom*;
или чтоRandom random=new StdRandom();
должен делать? - person Ted Lyngmo   schedule 14.11.2019