Vector — push_back использует конструктор по умолчанию, а не конструктор копирования

Я сталкиваюсь с проблемой добавления новых элементов в мой вектор.
Начнем с иерархии

Индекс компании. Компании содержат акции

Index
{
...
vector <Company> composition;
...
}

Company
{
...
vector <Stock> stocks;
...
}

Stock
{
....
}

Проблема в том, что я начинаю добавлять в индекс компанию с акциями (до этого момента все в порядке)

Comapny c1(bla bla, some arguments);
mindex->composition.push_back(c1);

Где «миндекс» определяется как

 Index* mindex=new Index();

Я получил некоторые ошибки памяти, и я решил поставить некоторые cout<<"here\n"; в некоторых частях программы, чтобы увидеть, что происходит.

В то время как

mindex->composition.push_back(c1);

выполняется, (сначала я измерил его mindex->composition.resize(0); ) его размер увеличивается, так что все в нем перемещается во временный вектор и в composition все удалено Но потом vector использует не конструктор копирования, а конструктор по умолчанию для создания акций.

Stock::Stock()
{
cout<<"The default constructor\n";
}

Я получил это на экране около 6 раз.

Вопрос в том, почему vector не использует копирующий конструктор, когда его увеличивают?
(У меня есть мой конструктор копирования, объявленный и определенный)

ПОЛНЫЙ КОД, ГДЕ ПРОИЗОЙДЕТ:
Извините за мой язык — это польский язык 🙂

Akcja=Stock
Spolka=Company
Indeks=Index

void Portfel<T,T2,T3>::dodaj_spolke()
{
std::string nazwa;
double cena_emisji;
double aktualna_cena;
usi ilosc_akcji;
std::string indeks;
cout<<"Podaj nazwe spolki: \n";                      //UNIMPORTANT
cin>>nazwa;
cout<<"Podaj cene emisji akcji przy IPO. \n";
cin>>cena_emisji;
cout<<"Ile akcji jest w obiegu ?\n";
cin>>ilosc_akcji;
cout<<"Jaka jest aktualna cena? \n";
cin>>aktualna_cena;
if (mindex->GetNast()==NULL)
{
cout<<"Spolka zostanie przypisana domyslnie do WIG. \n";
indeks="WIG";
}
else
{
cout<<"Do jakiego indeksu nalezy spolka? \n";
cin>>indeks;
}                                                         //TILL THIS MOMENT
Spolka s1(nazwa,cena_emisji,aktualna_cena,ilosc_akcji,indeks);
cout<<"-------------------------------------------\n";
for (int i=0;i<(int)s1.akcje.size();i++)
{
cout<<"Spolka: "<<s1.akcje[i].spolka<<endl;
cout<<"Cena aktualna: "<<s1.akcje[i].cena_aktualna<<endl;
cout<<"Twoja cena zakupu: "<<s1.akcje[i].cena_zakupu<<endl;
}
cout<<"-------------------------------------------\n";
cout<<"tutaj po dodaniu spolki \n";
cout<<"Przed zmiana \n";
Spolka s2=s1;
mindex->sklad.push_back(Spolka s1); // tutaj błąd
cout<<"Zmiana rozmiaru wektora - tutaj pomiedzy \n";
mindex->ilosc_spolek++;
for (int i=0;i<ilosc_akcji;i++)
{
mindex->sklad[mindex->ilosc_spolek-1].akcje[i].spolka=nazwa;
mindex->sklad[mindex->ilosc_spolek-1].akcje[i].cena_aktualna=aktualna_cena;
Akcja::Akcja()
{
//std::cout<<sizeof(this)<<std::endl;
cout<<"Domyslny konstruktor \n";
}
Akcja::Akcja(std::string nazwa,double akt)
{
spolka=nazwa;
cena_zakupu=0;
cena_aktualna=akt;
zysk=cena_zakupu-cena_aktualna;
}
Akcja::Akcja(const Akcja& a1)
{
this->spolka=a1.spolka;
this->cena_zakupu=a1.cena_zakupu;
this->cena_aktualna=a1.cena_aktualna;
this->zysk=a1.zysk;
}    mindex->sklad[mindex->ilosc_spolek-1].akcje[i].cena_zakupu=0;
mindex->sklad[mindex->ilosc_spolek-1].akcje[i].zysk=0;

}
cout<<"tutaj koniec\n";
cout<<"Ilosc spolek w mindex: "<<mindex->sklad.size()<<"\n";
cout<<mindex->ilosc_spolek<<endl;
cout<<"-------------------------------------------\n";
for (int i=0;i<mindex->ilosc_spolek;i++)
{
cout<<mindex->sklad[i].GetNazwa()<<endl;
cout<<mindex->sklad[i].akcje[0].GetSpolka()<<endl;
cout<<mindex->sklad[i].akcje[0].cena_zakupu<<endl;
cout<<mindex->sklad[i].akcje[0].cena_aktualna<<endl;
}
cout<<"-------------------------------------------\n";
getchar();
}

spolka.cpp (только касающаяся часть — нет необходимости вставлять остальную часть кода, но я, очевидно, могу, если хотите)

Spolka::Spolka(string naz,double cena_e,double cena_a,usi ilosc,string ind)
{
nazwa=naz;
cena_emisji=cena_e;
aktualna_cena=cena_a;
ilosc_akcji=ilosc;
akcje.resize(0);
for(int i=0;i<ilosc;i++)
{
akcje.push_back(Akcja (naz,cena_e));
}
indeks=ind;
std::cout<<"Dodano spolke: "<<this->nazwa<<endl;
}

akcja.cpp

Akcja::Akcja()
{
//std::cout<<sizeof(this)<<std::endl;
cout<<"Domyslny konstruktor \n";
}
Akcja::Akcja(std::string nazwa,double akt)
{
spolka=nazwa;
cena_zakupu=0;
cena_aktualna=akt;
zysk=cena_zakupu-cena_aktualna;
}
Akcja::Akcja(const Akcja& a1)
{
this->spolka=a1.spolka;
this->cena_zakupu=a1.cena_zakupu;
this->cena_aktualna=a1.cena_aktualna;
this->zysk=a1.zysk;
}

и эффекты:

после добавления первой компании

    tutaj po dodaniu spolki
Przed zmiana
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Zmiana rozmiaru wektora - tutaj pomiedzy
tutaj koniec
Ilosc spolek w mindex: 1
1
-------------------------------------------
KGHM
KGHM
0
160
-------------------------------------------
Usunieto: KGHM
Usunieto: KGHM

and after adding second company

tutaj po dodaniu spolki
Przed zmiana
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Domyslny konstruktor
Usunieto: KGHM
Zmiana rozmiaru wektora - tutaj pomiedzy
tutaj koniec
Ilosc spolek w mindex: 2
2
-------------------------------------------
KGHM

==2375== Conditional jump or move depends on uninitialised value(s)
==2375==    at 0x539A683: __printf_fp (printf_fp.c:406)
==2375==    by 0x53975B7: vfprintf (vfprintf.c:1629)
==2375==    by 0x53BF441: vsnprintf (vsnprintf.c:120)
==2375==    by 0x4EB62DF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18)
==2375==    by 0x4EBC715: std::ostreambuf_iterator<char, std::char_traits<char> >

Я знаю, что это очень много, но я был бы очень благодарен за помощь.

0

Решение

mindmindex->composition.resize(0);

Это действительно должно быть 0? Предполагая, что вы изменили размер вектора, resize это то, что вызывает конструктор по умолчанию, поэтому вы видите The default constructor 6 раз То, что вы, вероятно, хотели reserve и не resize который не вызывает конструктор по умолчанию.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector