#include "Visit.h"
class Patient
{
private:
std::string name;
std::string IC;
List<Visit> *visitList;
List<MC> mcList;
public:
Patient();
Patient(std::string, std::string);
void addVisit(Visit);
List<Visit> *getVisitList();
};
//End of Patient.h
#include "Patient.h"
Patient::Patient()
{
visitList = new List<Visit>();
}
Patient::Patient(std::string ic, std::string n) : name(n), IC(ic)
{
visitList = new List<Visit>();
}
void Patient::addVisit(Visit v)
{
visitList->add(v);
}
List<Visit> * Patient::getVisitList()
{
return visitList;
}
//End of Patient.cpp
class Visit
{
private:
__int64 time;
double cost;
bool xRayStatus = false;
public:
Visit();
Visit(__int64, double);
void addXRay();
bool getXRayStatus();
};
//End of Visit.h
#include "Visit.h"
Visit::Visit() {
}
Visit::Visit(__int64 t, double c) : time(t), cost(c) {
}
void Visit::addXRay()
{
xRayStatus = true;
}
bool Visit::getXRayStatus()
{
return xRayStatus;
};
//End of Visit.cpp
int main()
{
int pos;
Visit v(/*current time, cost*/);
Patient p()
unordered_map<string, Patient> patientMap;
string IC;
getline(cin,IC);
Patient p(IC, "John");
patientMap.insert({IC, p});
Patient *pc;
Visit *vc;
pos = patientMap[IC].getVisitList()->getLength();
pc = &patientMap[IC];
pc->addVisit(v); //Debugger shows patientMap[IC].getVisitList()->getLength() becomes 2
pc->getVisitList()->get(pos).addXRay(); //patientMap[IC].getVistList()->get(0).getXRayStatus() still false
vc = &patientMap[IC].getVisitList()->get(pos);
vc->addXRay(); //patientMap[IC].getVistList()->get(0).getXRayStatus() still false
}
如何让getXRayStatus成为现实?我似乎很奇怪,我可以在列表中添加项目但不执行其他功能,如vc-&gt; addXRay。 vc本身显示为true但该更改未反映在我的地图上。 电脑以某种方式可以添加访问并在地图上显示更改。
答案 0 :(得分:2)
在List<Visit>
中,您保留Visit
s的实例。在设置xRayStatus时,您将更改从列表中获取的本地Visit
副本的状态,而不是列表中的实际对象。
答案 1 :(得分:0)
在扩展评论对话中,提问者要求提供一般性重新设计帮助,以避免因使用Visit
get()
副本而导致的问题。我的重新设计建议是:
List
。无论你是自己写的还是在其他地方写的,它肯定比你需要的更多。使用std::vector<>
作为首选的集合类,只有在需要时才更改为其他内容。Patient
中保留指向您的馆藏的指针,除非它们可能是巨大的记忆力。将向量作为成员变量。这将节省您必须编写大量清理代码。Visit
个对象。使用make-shared()
或make_unique
为您自己提供指向堆上visit
个对象的智能指针。将这些指针保存在向量中,您可以将它们用来改变堆中实际访问中的实际值Visit
,因为目前我不清楚如何在有多个main
知道Visit
内部的所有内容(不是我赞同的),但Patient
创建一个空的,然后跳过箍试图抓住它并改变它的一些属性。为什么不让Patient
设置这些属性?或者main()
创建Visit
,填写所有属性,然后将其交给Patient
说“在这里,将其添加到您的收藏中”?你现在正在做的事情比它需要的要困难得多。 最后,找一个适合你的教程,书籍或在线课程,让你清楚地了解对象和指针之间的区别,使用指针的好理由,对析构函数的需求(你现在没有)以及好的衡量标准解释了std::
和其他地方的集合类。教程和架构建议不适合StackOverflow的Q&amp; A机制。