C ++失去参考

时间:2020-01-25 18:13:09

标签: c++

这是我的代码:

class Event{
    string name;
    string description;
    vector<Employee> assignedEmployees;
    Date date;
    Level requiredLevel;
public:
    bool addEmployee(Employee &employee);   //adds employee to the vector 'assignedEmployees'
    vector<Employee> getAssignedEmployees() const {return this->assignedEmployees;};
    //...

class Calendar {
    int year;
    bool leap;
    set <Event> events;
public:
    bool addEvent(Event &event);
    Event getNearestEvent() const;  //from set 'events' returns first value
    //...

bool Calendar::addEvent(Event &event) {
    //some conditions

    this->events.insert(event);
    return true;
}

bool Event::addEmployee(Employee &employee){
    if (isAssigned(employee) == true) {
        return false;
    }
    //some conditions
    assignedEmployees.push_back(employee);
    return true;
}

我正在创建测试以检查其是否按预期工作。这是我的测试之一:

TEST(MyTest, TestDescription) {
    Calendar cal1(2017);
    Calendar cal2(2018);
    Employee emp1("A"); Employee emp2("B");
    Date date1; date1 << "14.2.2017";   //not important part for this problem
    Date date2; date2 << "29.2.2018";
    Event projectLaunch(date1, "projectLaunchName", "projectLaunchDescription");
    //PLACE B
    cal1.addEvent(projectLaunch)
    //PLACE A
    ASSERT_EQ(2, cal1.getNearestEvent().getAssignedEmployees().size());
}

因此,我希望这个断言是正确的(因为通过以下代码,我确实向事件'projectLaunch'分配了2名员工)。但是结果取决于我放在哪里:

projectLaunch.addEmployee(emp1);
projectLaunch.addEmployee(emp2);

我有2个选项-如我在上面标记的-位置A或B。我更喜欢位置A,但是这里它返回0(因此ASSERT_EQ(2,0)不正确)。当我把它放在B上时,这是真的。问题出在哪儿?将事件添加到日历类然后从日历实例询问时,我会丢失参考吗?

1 个答案:

答案 0 :(得分:1)

将事件添加到日历时,将复制该事件。添加后对projectLaunch进行更改时,将对本地变量而不是存储在cal1中的副本进行更改。

此外,存储在set中的值为const,因为对其进行任何更改都会使集合所依赖的排序顺序无效。因此,将其添加到集合后更改该值是不可行的。 (请注意,可以更改存储在集合中的值,但这需要非常小心。通常,对象将从集合中提取,更改并重新插入。)

在添加日历之前,您必须继续向事件添加员工。

相关问题