ベクターに新しい要素を追加するという問題に直面しています。ヘラルキーから始めましょう
インデックスには企業が含まれます。企業には株式が含まれています
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> >
大変だとは存じますが、お役に立てれば幸いです。