2013-05-12 211 views
0

我正面臨向我的向量添加新元素的問題。 讓我們從層級開始矢量 - push_back使用默認的構造函數不復制構造函數

指標conatins公司。公司包含股票

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

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

Stock 
{ 
.... 
} 

問題是,當我開始添加公司股票(直到這一刻一切正常)到哪裏「MINDEX」被定義爲

Index* mindex=new Index(); 
指數

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

我收到了一些內存錯誤,並決定在程序的某些部分放置一些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> >  

後,我知道這是很多,但我會的幫助非常感激。

+0

我想你可以在這裏找到你的問題的答案http://stackoverflow.com/questions/6310638/c-vectorpush-back-using-default-copy-constructor – psibar 2013-05-12 21:17:29

+0

這不是這個東西 – user1960582 2013-05-12 22:14:29

回答

0
mindmindex->composition.resize(0); 

那真的應該是0?假設你調整了矢量大小,resize就是默認的構造函數,所以這就是你看到The default constructor 6次的原因。你可能想要的是reserve而不是resize它不會調用默認的構造函數。

+0

在開始時,是的。 因爲程序啓動時mindex->​​組成由0個公司組成。 但是你知道..我在開始時調整了矢量大小。 現在的問題是股票,而不是索引 – user1960582 2013-05-12 21:35:53

+0

我無法從代碼中知道,但是無論何時調整矢量大小,都會調用默認的構造函數來初始化元素。爲了避免這種情況,不要調整矢量大小並在將元素推回到矢量上之前調用「reserve」。 – 2013-05-12 21:48:46

+0

我發現它 它是在斯波爾卡的複製建設者。 我在那裏創建了一個默認構造函數:) – user1960582 2013-05-12 22:42:45