更改对象的值后,对象的打印数组仍给出相同的值

时间:2019-01-18 23:50:55

标签: c++ arrays oop

我正在使用静态数组和另一个包含人们个人信息的名为“患者”的类来创建ADT类。问题是,如果我创建一个Patient对象,然后将其插入数组中,然后更改该对象的值,则即使打印对象本身给出了更改后的值,打印该数组也会得到旧对象的值。

我添加了一个operator =函数来复制值,但这对我没有帮助。

List.h

class List {
private:
  static const int MAX_ELEMENTS = 5;                       
  Patient elements[MAX_ELEMENTS];    
  int elementCount;                                     
public:
  List();
  int  getElementCount() const;
  bool insert(const Patient& newElement);
  void print(); 
};

Patient.h

class Patient {
private:
string name;
string home_address;
string phone_number;
string email_address;
public:
Patient();
Patient(string aName, string anAddress, string Aphone, string anEmail);
Patient(const Patient& obj);
// + all the getters and setters for the private values
friend ostream & operator<<(ostream & os, const Patient & p);
Patient& operator=(const Patient& p);
};

插入功能

bool List::insert(const Patient& newElement)
{
 bool flag = true;
 for (int i = 0; i < elementCount; i++)
  {
    if (elements[i] == newElement)
    {
        flag = false;
        break;
    }
}
if (flag == true && elementCount <= capacity)
{
    elements[elementCount] = newElement;
    elementCount++;
}
else
 flag = false;
 return flag;
}

operator =函数

Patient & Patient::operator=(const Patient & person)
{
   name = person.name;
   home_address = person.home_address;
   phone_number = person.phone_number;
   email_address = person.email_address;
   return *this;
}

很遗憾,我无法共享.cpp文件。

这是仅打印一个对象的数组的情况。

Patient: To be entered, To be entered, To be entered, To be entered

提供名称和电子邮件地址,并使用其自己的重载运算符<<函数来打印对象。这是打印阵列时所需的输出。

Patient: bob, To be entered, To be entered, bob@mail.com

实际输出。

Patient: To be entered, To be entered, To be entered, To be entered

1 个答案:

答案 0 :(得分:1)

几乎可以肯定,您的插入代码如下:

bool List::insert(const Patient& newElement)
{
    ...
    elements[someIndex] = newElement;
    ...
}

这不是将newElement放入数组,而是将其分配给数组中的现有项(即,调用Patient::operator=)。

因此,它们是两个单独的对象。在数组外部更改一个不会影响其中的一个,反之亦然。

您可能想要List中的某些东西可以返回对数组对象之一的引用以允许您对其进行更改。例如,

Patient& List::operator[](size_t index)
{
   //<test here to make sure index is in range>
   return elements[index];
}

这将使您可以执行以下操作:

Patient& pat = theList[0];
pat.setEmail("test@email.com");

,数组中的项目将显示该更改。


和/或,我读错了,您只是没有正确实现operator=