簡體   English   中英

向量-push_back使用默認構造函數而不是復制構造函數

[英]Vector - push_back uses default constructor not copy constructor

我正面臨在向量中添加新元素的問題。 讓我們從君主制開始

索引素公司。 公司包含庫存

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> >    

我知道很多,但我將非常感謝您的幫助。

mindmindex->composition.resize(0);

那真的應該是0嗎? 假設您調整了向量的resize ,則resize是調用默認構造函數的原因,因此這就是您看到The default constructor 6次的原因。 您可能想要的是reserve而不resize ,這不會調用默認構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM