2013-05-12 207 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