这是我的代码:
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上时,这是真的。问题出在哪儿?将事件添加到日历类然后从日历实例询问时,我会丢失参考吗?
答案 0 :(得分:1)
将事件添加到日历时,将复制该事件。添加后对projectLaunch
进行更改时,将对本地变量而不是存储在cal1
中的副本进行更改。
此外,存储在set
中的值为const
,因为对其进行任何更改都会使集合所依赖的排序顺序无效。因此,将其添加到集合后更改该值是不可行的。 (请注意,可以更改存储在集合中的值,但这需要非常小心。通常,对象将从集合中提取,更改并重新插入。)
在添加日历之前,您必须继续向事件添加员工。