我正面临向我的向量添加新元素的问题。让我们从等级制度开始
索引包含公司。公司包含股票
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
不使用复制构造函数,而是使用默认构造函数来创建 Stocks。
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> >
我知道这很多,但我会非常感谢您的帮助。