Vector - push_back使用默认构造函数而不是复制构造函数

时间:2013-05-12 21:06:57

标签: c++ vector push back

我面临向向量添加新元素的问题。 让我们从层次结构开始

指数公司。公司包含股票

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使用的不是复制构造函数,而是默认构造函数来创建股票。

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

我在屏幕上看到这个大约6次。

问题是:为什么vector在放大时不使用复制构造函数? (我已经声明并定义了我的复制构造函数)

完成代码的地方发生了什么: 对不起我的语言 - 这是波兰语:))

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

我知道这很多,但我真的很感激你的帮助。

1 个答案:

答案 0 :(得分:0)

mindmindex->composition.resize(0);

真的应该是0吗?假设你调整了向量的大小,resize就是调用默认构造函数的,所以这就是你看到The default constructor 6次的原因。您可能需要的是reserve而不是resize,它不会调用默认构造函数。