问题
I'm facing the problem of adding new elements to my vector. Let's start with the herarchy
Index conatins Companies. Companies contain Stocks
Index
{
...
vector <Company> composition;
...
}
Company
{
...
vector <Stock> stocks;
...
}
Stock
{
....
}
The problem is when I start adding a company with stocks (till this moment everything is ok) to an index
Comapny c1(bla bla, some arguments);
mindex->composition.push_back(c1);
Where "mindex" is defined as
Index* mindex=new Index();
I got some memory errors and I decided to put some cout<<"here\n";
in some parts of the program to see what was going on.
While
mindex->composition.push_back(c1);
is being executed, (at first I sized it mindex->composition.resize(0);
) it's size is being enlarged so that everything in it is moved to the temporary vector and in composition
everything is deleted. But then vector
uses not copy constructor, but default constructor to create the Stocks.
Stock::Stock()
{
cout<<"The default constructor\n";
}
I got this on the screen about 6 times.
The question is: Why vector doesn't use copy contructor when it is being enlarged? (I have my copy constructor declared and defined)
COMPLETE CODE WHERE THE THING HAPPENS: Sorry for my language - it's Polish :)
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 (the concerning part only - there's no need to paste the rest of the code, but I obviously may if you wish)
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;
}
and the effects:
after adding first company
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> >
I know it's much but I would be really grateful for help.
回答1:
mindmindex->composition.resize(0);
Was that really supposed to be 0
? Assuming you resized the vector, resize
is what calls the default constructor, so that is the reason why you see The default constructor
6 times. What you probably wanted is reserve
and not resize
which does not call the default constructor.
来源:https://stackoverflow.com/questions/16512049/vector-push-back-uses-default-constructor-not-copy-constructor