如何将类成员添加到向量并正确使用它?

时间:2015-11-13 21:19:16

标签: c++

假设我有这个课程

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();

我得到了正确的答案,所以我想知道为什么会这样。

1 个答案:

答案 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也是如此。请注意员工姓名是如何通过引用返回的。看看我所做的所有参考文献的位置,以及它们避免了多少副本。这将确保您始终使用相同的数据集。