Я пытаюсь создать контейнер для мешков. Проблема, которая выше меня возникает, когда я перегружаю оператор =
.Заблудиться при передаче параметра по ссылке, по значению
Zsak& Zsak::operator =(const Zsak& a)
{
(*this).V=a.V;
(*this).elemsz=a.elemsz;
return *this;
}
с этим заголовком:
class Zsak
{
public:
Zsak(){V=new Elem[100];}
Zsak (const Zsak & a)
{
*this=a;
}
Zsak(int meret)
{
V=new Elem[meret];
}
~Zsak(){delete[] V;}
Zsak& operator -(const Zsak& b);
Zsak& operator =(const Zsak& a);
void Zsak_Ba(int e);
void Zsak_Bol(int e);
bool Uress();
int E_Hany(int e) const;
friend std::ostream& operator << (std::ostream& out,const Zsak& z);
private:
Elem *V;
int elemsz=0;
};
Zsak_Ba
помещает элемент в мешок;
Zsak_Bol
вытягивает элемент из сумки;
То, что я наблюдал посредством тестирования, заключается в том, что адрес const Zsak a
идентифицируется адресом *this
.
с этим контекстом
Zsak z(5),c(5);
z.Zsak_Ba(1);
z.Zsak_Ba(1);
z.Zsak_Ba(1);
z.Zsak_Ba(2);
z.Zsak_Ba(2);
z.Zsak_Ba(2);
z.Zsak_Ba(4);
Zsak d=z;
d.Zsak_Bol(1);
cout<<z<<endl<<d;
Он печатает:
1 2
2 3
4 1
1 2
2 3
4 1
И то, что он действительно должен напечатать это:
1 3
2 3
4 1
1 2
2 3
4 1
Что я должен сделать, чтобы получить это? Что я делаю неправильно? И почему?
Большое спасибо!
Вы только копируете указатель здесь: '(* this) .V = a.V;'. Итак, теперь два объекта указывают на одни и те же данные. – juanchopanza
А что делать, чтобы устранить это? – Iero
Назначьте все элементы массива, на которые указывает объект RHS, на объекты массива, на которые указывает объект LHS. – juanchopanza