【问题标题】:How do i change an object through the use of pointers?如何通过使用指针来更改对象?
【发布时间】:2014-01-25 17:46:06
【问题描述】:
#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->addXRay,这对我来说似乎很奇怪。 vc 本身显示为 true,但更改未反映在我的地图上。 pc 能够以某种方式添加访问并在地图上显示更改。

【问题讨论】:

  • 关于标题中的问题,让指针指向另一个对象?
  • 你的List 班级坏了吗? (即它的get() 按值返回?)
  • @KerrekSB 我的 List 类是通过指针实现的。 get() 返回节点->item;
  • @KateGregory 有没有办法更改这些虚拟副本?
  • @KateGregory 是的,由于这个虚拟副本问题,我遇到了地狱。如果不更改我的 List 类,我能做些什么吗?我有程序的其他部分使用它。我的 X 射线正在就诊中,因为患者可能有多次就诊和治疗,条件都在该就诊对象中。

标签: c++ object pointers reference


【解决方案1】:

List&lt;Visit&gt; 中,您保留了Visits 的实例。当您设置 xRayStatus 时,您正在更改从列表中获得的本地 Visit 副本的状态,而不是列表中的实际对象。

【讨论】:

  • 那么我该如何改变列表中的实际对象呢?
【解决方案2】:

在扩展评论对话中,提问者要求提供一般重新设计帮助,以避免使用来自 get()Visit 副本引起的问题。我的重新设计建议是:

  • 停止使用List。无论您是自己编写的还是在其他地方获得的,它肯定比您需要的要多。使用std::vector&lt;&gt;作为首选的集合类,只有在需要时才换成别的。
  • 不要在Patient 中保留指向您的集合的指针,除非它们可能会占用大量内存。将向量作为成员变量。这将节省您编写大量清理代码的时间。
  • 停止在集合中保持稳定的Visit 对象。使用make-shared()make_unique 为自己获取指向堆上visit 对象的智能指针。将这些指针保留在向量中,您可以根据它们来更改堆上实际访问中的实际值
  • 考虑将日期和时间或访问号码添加到 Visit,因为目前我不清楚当有多个访问时您如何找到特定访问
  • 先在事物中设置属性,然后再将它们放入集合中。您的main 知道Visit 的所有内部信息(我不赞成),但让Patient 创建一个空的,然后跳过箍试图抓住它并更改它的一些属性。为什么不让Patient 设置这些属性?还是让main() 创建一个Visit,填写所有属性,然后将其交给Patient,说“这里,将此添加到您的收藏中”?你现在所做的比它需要的要困难得多。

最后,找到适合您的教程、书籍或在线课程,让您清楚对象和指针之间的区别、使用指针的充分理由、对析构函数的需求(您目前没有)以及好的措施解释了std:: 和其他地方的集合类。教程和架构建议不适合 StackOverflow 的问答机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2014-11-12
    • 2011-05-26
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多