Мне грозит проблема добавления новых элементов в мой вектор. Начать с herarchyВектор - push_back использует конструктор по умолчанию, а не конструктор копирования
Индекс conatins компаний. Компании содержат запасов
Index
{
...
vector <Company> composition;
...
}
Company
{
...
vector <Stock> stocks;
...
}
Stock
{
....
}
Проблема заключается в том, когда я начинаю добавить компанию с акциями (до этого момента все в порядке) к индексу
Comapny c1(bla bla, some arguments);
mindex->composition.push_back(c1);
Где «MINDEX» определяется как
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 раз.
Вопрос в том, почему вектор не использует копировальный контур, когда он расширяется? (я мой экземпляр конструктор объявлен и определен)
ПОЛНЫЙ КОД КОТОРОЙ ПРОИСХОДИТ ВЕЩЬ: Извините за мой язык - это польский :)
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> >
Я знаю, что это много, но я был бы очень благодарен за помощь.
Я думаю, вы можете найти ответ на свой вопрос здесь http://stackoverflow.com/questions/6310638/c-vectorpush-back-using-default-copy-constructor – psibar
Это не та вещь – user1960582