如何通过使用指针更改对象?

时间:2014-01-25 17:46:06

标签: c++ object pointers reference

#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但该更改未反映在我的地图上。 电脑以某种方式可以添加访问并在地图上显示更改。

2 个答案:

答案 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机制。