2013-05-12 1 views
0

내 벡터에 새 요소를 추가하는 문제가 있습니다. 헤라 카디부터 시작해 보겠습니다.Vector - push_back은 생성자가 아닌 기본 생성자를 사용합니다.

인덱스 conatins Companies. 회사는 내가 "mindex는"

Index* mindex=new Index(); 
로 정의 인덱스

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

에 (이 순간 모든 것이 확인 될 때까지) 주식을 가진 회사를 추가 시작할 때

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

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

Stock 
{ 
.... 
} 

문제는 주식을 포함

메모리 오류가 발생하여 프로그램의 일부에 cout<<"here\n";을 넣기로 결정했습니다.

mindex->composition.push_back(c1); 

이 실행되는 동안

는, 그 안에 모든 것이 임시 벡터로 이동 composition 모든 것을 삭제에되도록 그것의 크기 확대되고있다 (처음에 나는 mindex->composition.resize(0); 그것을 크기). 그러나 vector은 생성자를 복사하지 않고 기본 생성자를 사용하여 주식을 만듭니다.

Stock::Stock() 
{ 
    cout<<"The default constructor\n"; 
} 

나는 이것을 약 6 번 가지고있다.

질문 : 벡터가 복사 도중 확대자를 사용하지 않는 이유는 무엇입니까? (내 복사 생성자 선언 및 정의)

것은이 발생

COMPLETE CODE : 죄송합니다 를 내 언어 - 아니가 - 그것은 폴란드어 :

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; 
} 
01 23,516,

및 효과 :

최초의 회사에게

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

+0

이게 아니예요. – user1960582

답변

0
mindmindex->composition.resize(0); 

정말 그랬습니까 0? 벡터의 크기를 변경했다고 가정하면 resize이 기본 생성자를 호출하는 것이므로 The default constructor이 6 번 나타나는 이유입니다. 당신이 원했던 것은 reserve이고 기본 생성자를 호출하지 않는 resize이 아닙니다.

+0

처음에는 예 . 프로그램이 시작될 때 mindex-> ​​composition은 0 개의 회사로 구성됩니다. 아시다시피, 저는 처음에 벡터의 크기를 조정했습니다. 이제 인덱스에서 문제가 발생했습니다. – user1960582

+0

코드에서 알 수 없지만 벡터의 크기를 조정할 때마다 기본 생성자가 호출되어 요소를 초기화합니다. 이를 피하기 위해 벡터의 크기를 조정하지 말고 요소를 벡터 위로 밀어 넣기 전에'reserve'를 호출하십시오. –

+0

나는 그것을 발견했다 그것은 사본의 건축가에서 있었다. 기본 construcot을 만든 라인을 만들었습니다. – user1960582

관련 문제