Потеря данных каждый раз, когда я помещаю объект в вектор - PullRequest
0 голосов
/ 20 мая 2018

У меня есть школьный проект, в котором я должен создать шаблон класса Vanzare, означающий продажу.У меня есть 2 вектора STL, один для автомобилей, которые есть в наличии, и один для автомобилей, которые продаются, и 2 переменных, которые подсчитывают, сколько автомобилей есть в наличии и сколько машин продано.

Класспредполагается, что оператор -= перегружен, и он должен продать автомобиль, то есть удалить его из векторного запаса (с именем stoc) и добавить его в проданный вектор (с именем vandut).

Я также перегрузил оператор +=, чтобы добавить автомобиль в запас.

Все типы автомобилей, которые у меня есть, все получены из базового класса Masina, а некоторые из них имеют дополнительные поля.

Проблема в том, что всякий раз, когда я использую += или -= (или push_back() в целом) для всего, что имеет дополнительные поля (по сравнению с базовым классом), оно отделяет предыдущие элементы от вектора.Поэтому я не могу хранить производные объекты без потери информации.

Мне также сказали, что может помочь специализация всего класса, но это не помогло.

Шаблонный классначинается около линии 300 (я не знал, как это выделить, извините).Прошу прощения, если то, что я написал, было непонятно, я новичок во всех этих объектно-ориентированных вещах.Заранее спасибо!

Редактировать: Я старался изо всех сил, чтобы сократить программу настолько, насколько смогу, но она все еще имеет 250 строк кода.Я также переименовал (надеюсь, все) на английский.Поле sh все еще теряется, когда я добавляю объект в вектор.

#include <iostream>
#include <string.h>
#include <vector>
#include <ctime>

using namespace std;

class Car
{
int capacity;
float length;
int price;
int year;


public:

int getYear();
void setPrice(int);
int getPrice();
Car();
~Car();
Car(int , float , int , int);
Car(const Car&);

friend istream& operator>>(istream& , Car&);
friend ostream& operator<<(ostream& , Car&);
friend class VAN;
};

int Car::getYear()
{
return year;
}

int Car::getPrice()
{
return price;
}

void Car::setPrice(int p)
{
price = p;
}

ostream& operator<<(ostream& out , Car& m)
{
out<<"capacity: "<<m.capacity<<"\nlength: "<<m.length<<"\nprice: "<<m.price<<"\nYear: "<<m.year;
return out;
}

istream& operator>>(istream& in , Car& m)
{
cout<<"capacity: ";
in>>m.capacity;
cout<<"length: ";
in>>m.length;
cout<<"price: ";
in>>m.price;
cout<<"Year: ";
in>>m.year;

return in;
}

Car::Car()
{
capacity = 0;
length = 0;
year = 0;
price = 0;
}

Car::Car(int lit , float lun , int an , int pre)
{
capacity = lit;
length = lun;
year = an;
price = pre;
}

Car::Car(const Car& m)
{
capacity = m.capacity;
length = m.length;
year = m.year;
price = m.price;
}

Car::~Car()
{
capacity = 0;
year = 0;
length = 0;
price = 0;
}

class VAN:public Car
{

int sh;

public:
void setSH(int);
int isSH();
VAN();
~VAN();
VAN(int , float , int , int , int);
VAN(const VAN&);

friend istream& operator>>(istream& , VAN&);
friend ostream& operator<<(ostream& , VAN&);
};

void VAN::setSH(int s)
{
if(s)
    sh = 1;
else
    sh = 0;
}

int VAN::isSH()
{
return sh;
}

ostream& operator<<(ostream& out , VAN& m)
{
out<<(Car&)m;
out<<endl<<"Second hand: "<<m.sh;

return out;
}

istream& operator>>(istream& in , VAN& m)
{
in>>(Car&)m;
cout<<"Second Hand: ";
int x;
in>>x;
if(x)
    m.sh = 1;

return in;
}

VAN::VAN():Car()
{
;
}

VAN::~VAN()
{
;
}

VAN::VAN(int a , float b , int c, int d , int s):Car(a , b, c , d)
{
if(s)
sh = 1;
}

VAN::VAN(const VAN& m):Car(m)
{
;
}

template <class T>
class Sale
{
vector<T> stock;
vector<T> sold;

int nrSold;
int nrStock;

public:

Sale();
Sale<T>& operator += (T&);
template <class U>
friend ostream& operator<<(ostream& , Sale<U>& );
Sale<T>& operator -= (int);
};

template <class T> Sale<T>& Sale<T>::operator -= (int i)
{
nrStock--;
nrSold++;
sold.push_back(stock[i]);

stock.erase(stock.begin()+i);

time_t now = time(0);
tm *ltm = localtime(&now);

if(ltm->tm_mon == 5 || ltm->tm_mon == 6 || ltm->tm_mon == 7)
{
    (sold[nrSold-1]).setPret((sold[nrSold-1].getPret()/10)*9);
}

return *this;

}

template <class T> Sale<T>::Sale()
{
nrSold = 0;
nrStock = 0;
}

template <class T> ostream& operator<<(ostream& out, Sale<T>& v)
{
out<<"\nWhat we have in stock:\n\n";
for(int i = 0; i < v.nrStock ; i++)
{
    out<<v.stock[i]<<endl;
}

cout<<"\nWhat we sold:\n\n";
for(int i = 0; i < v.nrSold ; i++)
{
    out<<v.sold[i]<<endl;
}


return out;
}

template <class T> Sale<T>& Sale<T>::operator += (T& t)
{
nrStock ++;
stock.push_back(t);

return *this;
}

int main()
{
VAN x;
cin>>x;
cout<<x;

Sale<VAN> v;

v += x;
v += x;

cout<<v;
}

1 Ответ

0 голосов
/ 21 мая 2018

Во всех ваших конструкторах VAN есть логические ошибки:

  1. в конструкторе по умолчанию, элемент sh вообще не инициализируется, поэтому его значение не определено,

  2. В конструкторе преобразования элемент sh не инициализируется, если параметр s равен 0, поэтому в этом случае его значение является неопределенным.Ваш operator>> имеет аналогичную логическую ошибку, что он не обновляет элемент m.sh, если в конструкторе копирования установлено значение 0.

  3. , элемент sh не используетсяскопировано с m вообще, поэтому его значение не определено.

Когда вы вставляете объект VAN в vector, создается копия объекта.И если вектору необходимо перераспределить свой массив, чтобы увеличить его емкость, создаются новых копий существующих элементов.Поскольку ваш конструктор копирования поврежден, поэтому вы теряете значения sh.

Ваши конструкторы VAN должны выглядеть больше так: 1 :

VAN::VAN() : Car(), sh(0)
{
}

VAN::VAN(int a , float b , int c, int d , int s) : Car(a , b, c , d)
{
    sh = (s != 0);
}

VAN::VAN(const VAN& m) : Car(m), sh(m.sh)
{
}

1: в случае конструктора копирования вы можете фактически полностью его опустить и позволить компилятору автоматически сгенерировать подходящий для вас конструктор копирования.

И ваш *Вместо этого 1044 * должен выглядеть примерно так:

istream& operator>>(istream& in , VAN& m)
{
    in >> (Car&)m;
    cout << "Second Hand: ";
    int x;
    in >> x;
    m.sh = (x != 0);
    return in;
}

На нескольких примечаниях:

  • ваш sh член объявлен как int, но это явно должно быть bool.

  • VAN не нужно и не должно быть объявлено как friend из Car.Если VAN нужен прямой доступ к приватным членам Car, они должны быть объявлены как protected.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...