假设我有这个课程
class Employee {
string name;
vector<Employee> subEmployee;
Employee(string name, vector<Employee> subEmployee) {
this -> name = name;
this -> subEmployee = subEmployee;
}
vector<Employee> getSubEmployee() {
return this -> subEmployee;
}};
我创建了几个对象并连接它们,
Employee yunfei("yunfei",{});
Employee yuqi("yuqi",{});
Employee yuwei("yuwei",{});
Employee aona("aona",{});
Employee shang("shang",{});
yuqi.addNewEmployee(yuwei);
yuqi.addNewEmployee(aona);
yunfei.addSubEmployee(yuqi);
然后我想查看云飞有多少子工作人员,所以我用:
yunfei.getSubEmployee();
结果显示载体包含yuqi, 但是,当我尝试使用时:
yunfei.getSubEmployee()[0].getSubEmployee();
我只是得到一个空列表,但是当我使用时:
yuqi.getSubEmployee();
我得到了正确的答案,所以我想知道为什么会这样。
答案 0 :(得分:0)
与大多数人提到的一样,您希望使用引用来确保您始终引用同一名员工。
class Employee
{
using EmployeeList = std::vector<std::shared_ptr<Employee>>;
std::string mName;
EmployeeList mSubEmployees;
public:
Employee(const std::string& name, const EmployeeList& subEmployees = {})
: mName(name), mSubEmployees(subEmployees)
{}
const EmployeeList& GetSubEmployees() const { return mSubEmployees; }
const std::string& GetName() const { return mName; }
void AddSubEmployee(const std::shared_ptr<Employee>& employee) { mSubEmployees.push_back(employee); }
}
// I can make these employees first.
auto yuwei = std::make_shared<Employee>("yuwei");
auto aona = std::make_shared<Employee>("aona");
auto shang = std::make_shared<Employee>("shang");
// I can construct these employees using existing employees
auto yuqi = std::make_shared<Employee>("yuqi", { yuwei, aona });
auto yunfei = std::make_shared<Employee>("yunfei",{ yuqi });
// I can add new subs now
yunfei.addSubEmployee(shang);
// Even brand new employees
yunfei.addSubEmployee(new Employee("Aesthete");
这些员工只存在于您声明它们的上下文中。现在所有其他员工只能参考其他员工。您现在可以使用递归来迭代员工树。
void PrintEmployeeTree(const Employee& e, int level = 1)
{
for (const auto& employee : e->getSubEmployees)
{
std::cout << std::string(level, '-') << employee->GetName() << std::endl;
PrintEmployeeTree(employee, level+1);
}
}
PrintEmployeeTree(yunfei);
应该给你这样的东西:
-yunfei
--yuwei
---yuki
---aona
--shang
--Aesthete
尝试在任何有意义的地方使用引用。 const也是如此。请注意员工姓名是如何通过引用返回的。看看我所做的所有参考文献的位置,以及它们避免了多少副本。这将确保您始终使用相同的数据集。