2013-05-12 3 views
0

Мне грозит проблема добавления новых элементов в мой вектор. Начать с herarchyВектор - push_back использует конструктор по умолчанию, а не конструктор копирования

Индекс conatins компаний. Компании содержат запасов

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 раз.

Вопрос в том, почему вектор не использует копировальный контур, когда он расширяется? (я мой экземпляр конструктор объявлен и определен)

ПОЛНЫЙ КОД КОТОРОЙ ПРОИСХОДИТ ВЕЩЬ: Извините за мой язык - это польский :)

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

+0

Это не та вещь – user1960582

ответ

0
mindmindex->composition.resize(0); 

Действительно ли это должно было быть 0? Предполагая, что вы изменили размер вектора, resize - это то, что вызывает конструктор по умолчанию, поэтому именно поэтому вы видите The default constructor 6 раз. Вероятно, вы хотели бы получить reserve, а не resize, который не вызывает конструктор по умолчанию.

+0

В начале, да , Потому что при запуске программы mindex-> ​​состав состоит из 0 компаний. Но вы знаете .. Я изменил размер вектора в начале. Теперь проблема заключается в запасах, а не в индексе – user1960582

+0

Я не могу сказать по коду, но всякий раз, когда вы изменяете размер вектора, конструктор по умолчанию вызывается для инициализации элементов. Чтобы этого избежать, не изменяйте размер вектора и не вызывайте «резерв» вместо того, чтобы отбрасывать элементы обратно на вектор. –

+0

Я НАЙДЕНО ЭТО БЫЛО В КОПИРОВАННОМ КОНСТРУКТОРЕ СПОЛЬКИ. Я сделал там строку, которая построила по умолчанию construcotrs :) – user1960582

 Смежные вопросы

  • Нет связанных вопросов^_^