Исходя из C # / Java, я пытаюсь понять лучшие практики использования указателей и ссылок C ++. Я уверен, что это было покрыто до тошноты на этом сайте, но я до сих пор не до конца понимаю. Я прочитал некоторые часто задаваемые вопросы по C ++, но мне нужно увидеть их в контексте. Предположим, у меня есть два класса:
class Employee
{
Employee();
~Employee();
}
class Company
{
Company();
~Company();
AddEmployee(?? employee);
?? GetEmployee();
private:
std::list<Employee??> employees_;
}
Где AddEmployee
берет объект сотрудника и добавляет его в личный список сотрудников. Каким должен быть тип параметра AddEmployee
employee?
AddEmployee(Employee *employee);
AddEmployee(Employee& employee);
Каким типом шаблона должен быть закрытый std :: list?
Также предполагается, что класс компании может изменить сотрудника. const
уместно здесь? И если я использую ссылочный параметр, может ли класс Company развернуться и передать объект employee в другой класс?
UPDATE
Я вижу, что многие люди предлагают использовать семантику значений, но из C # / java это сложно. Обычно я делаю внедрение зависимостей с помощью интерфейсов, и я не уверен, что вы даже можете использовать семантику значений в этом случае. Можете ли вы кодировать интерфейсы, используя семантику значений?
В коде, над которым я сейчас работаю, почти все объекты размещены в куче, а мои функции-члены выглядят как void TakeSomeObject(SomeObject *someObject)
или MyClass(SomeService *service)
. Код работает, хотя по мере усложнения кода меня также беспокоят утечки памяти. Часть того, что мне было интересно, стоит ли мне менять эти сигнатуры методов, чтобы вместо них использовать ссылки, и каковы последствия этого.
Также, когда я читал об умных указателях, я хотел просмотреть мой код и заменить большинство указателей на shared_ptr, но мне не ясно, хорошо это или нет. И в этом случае я просто изменил бы все мои методы, чтобы принять shared_ptr в качестве параметра?
ОБНОВЛЕНИЕ 2
Кажется, что консенсус заключается в том, чтобы использовать AddEmployee(const Employee& employee)
или AddEmployee(Employee& employee)
для сотрудников, выделенных в куче. Я открыт для перемен перед лицом убедительных доказательств, но я не вижу себя пишущим версию семантики значений прямо сейчас: AddEmployee(Employee employee)
ОБНОВЛЕНИЕ 3
Я пытался написать такой метод, как:
AddEmployee(const Employee& employee)
{
employees_.push_back(??employee);
}
Однако, похоже, это не работает, пытаясь заменить ?? с ничего, &, или * когда список определен как std::list<Employee*> employees_
. Означает ли это, что мне нужно взять параметр указателя, а не ссылочный параметр, чтобы сделать что-то подобное?