【发布时间】:2011-12-15 11:19:47
【问题描述】:
来自 C#/Java 背景,我正在尝试了解使用 C++ 指针和引用的最佳实践。我敢肯定这个网站上已经报道了这个问题,但我仍然不完全理解。我已经阅读了一些 C++ 常见问题解答,但我需要在上下文中查看它。假设我有两个类:
class Employee
{
Employee();
~Employee();
}
class Company
{
Company();
~Company();
AddEmployee(?? employee);
?? GetEmployee();
private:
std::list<Employee??> employees_;
}
AddEmployee 获取一个员工对象并将其添加到员工的私有列表中。 AddEmployee 员工参数的类型应该是什么?
AddEmployee(Employee *employee);
AddEmployee(Employee& employee);
私有 std::list 应该是什么模板类型?
还假设公司类可以修改员工const这里合适吗?并且如果我使用引用参数,Company类是否可以转身将员工对象传递给另一个类?
更新
我看到很多人建议使用值语义,但来自 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_ 时,没有任何内容、& 或 *。这是否意味着我必须采用指针参数而不是引用参数才能执行此类操作?
【问题讨论】:
-
你了解 C 中的指针吗?
-
好的,如果您了解指针,那么您可以问自己一些类似的问题:
employees_成员是否适合作为指针容器或对象容器?您的方法应该采用指针还是按值传递对象? -
我更喜欢它是一个指针容器,因为我更喜欢 C#/java 的引用语义而不是 C++ 值语义。