Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Pana_Ruplahlava 09 Prosince 2011, 15:52:19

Název: C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 15:52:19
Ahoj, tak zase zápasím s céčkem :) Chcisi u hrdiny vytvořit inventář pomocí vektoru a trošku jsem se na tom zasekl... kompilátor nevyhazuje errory, ale program prostě spadne.

dejme tomu že mám 3 třídy(vektor v hlavicce mam stejne jeko includy ostatnich trid):

Kód: [Vybrat]
Postava.h
private:
vector<Inventar *> m_inv;
public:
void pridejPredmet(Inventar * inv);
void vypisInventar();

Postava.cpp
void Postava::pridejPredmet(Inventar *inv){
            this->m_inv.push_back(inv);

};
void Postava::vypisInventar(){
            cout<<"Tak se podivejme co se da najit po kapsach.../n Usopleny kapesniky, svaby a karamelky nepocitam.";
            int i;
            for(i=0; i< this->m_inv.size(); i++){
                cout<<i<<": "<<this->m_inv[i]->vratNazev()<<endl;
               
            }

        };

Kód: [Vybrat]
//predmet
Prase.h
private:
Inventar * m_inv;

Prase.cpp
m_inv = new Inventar("Prase",3);
postava->pridejPredmet(m_inv);

Kód: [Vybrat]
Inventar.h
 public:
    Inventar(string nazev, int vaha);
    private:
    string m_nazev;
    int m_vaha;
Inventar.cpp
//nic krome konstruktoru

Když se pokusím zavolat vypisInventar(); nebo jen cout<<m_int.size(); tak to spadne :-/ netusim co delam blbe. Nevi nekdo?
Název: Re:C++ vektor
Přispěvatel: Martin - ViPEr*CZ* 09 Prosince 2011, 16:19:07
Todle by mělo fungovat:

Kód: [Vybrat]
void Postava::vypisInventar(){
            cout << this->m_inv.size();             
}
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 16:23:50
bohužel :( zase spadne...
Název: Re:C++ vektor
Přispěvatel: Martin - ViPEr*CZ* 09 Prosince 2011, 16:28:09
Tak jsem slepej a nevidím to... jedině poslat vše o debugovat... co je v this->m_inv v inkriminovanou dobu.
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 16:54:09
debugovat neumim, jak to zjistím? zkoušel jsem něo googlit ale né moc úspěšně...
jinak sem to hodil sem, pokud by se s tím někomu chtělo piplat
http://leteckaposta.cz/378433925
spadne to pokud zadáte jméno a stisknete i a odentrujete (spustí se ta fce)
Název: Re:C++ vektor
Přispěvatel: Kedrigern 09 Prosince 2011, 17:07:56
No možná by bylo dobré, kdyby si sem dal něco jako ten výpis v první příspěvku, ale kompilovatelný. Ideálně v jednom souboru (ať to jde dobře číst bez širšího seznamování). Rád si oživím staré dovednosti, ale zas na to mám limitovaný čas.

Imho je chyba, co si vybavuji, házet do vectoru pointry, jelikož v nich už je obsažena nějaká referenční sémantika. Ale je to rok, co jsem v cpp psal.
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 17:09:35
uf... háže to segmentation fault a ten soubor sesmolím (co mi zbejvá :D )
Název: Re:C++ vektor
Přispěvatel: Kedrigern 09 Prosince 2011, 17:13:04
Jo a mám pravdu: http://www.cplusplus.com/reference/stl/vector/vector/

Kdybys to chtěl opravdu jinak, tak je správné řešení vlastní alokátor (tak nějak tipuji).

Taky jsem psal v cpp rpg hru. Je to docela těžké, protože to chce velkou praxi (právě kvůli těm referencím a pointrům).
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 17:16:40
uf příklad? jak tam nemaj být pointery? začínám a teď jsem velice blízko španělské vesnici :D
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 09 Prosince 2011, 17:33:21
je to v pr*** protoze kdyz to napisu jako jeden soubor tak to jede :o
Kód: [Vybrat]
#include <iostream>
#include <vector>


using namespace std;

class Inventar{
 private:
    string m_nazev;
    int m_vaha;

 public:
    Inventar(string nazev, int vaha){
    m_nazev = nazev;
    m_vaha = vaha;
    }
    string vratNazev(){
    return m_nazev;
    }
    };

class Postava{
private:
vector<Inventar *> m_inv;
public:
void pridejPredmet(Inventar *inv){
            this->m_inv.push_back(inv);

};
void vypisInventar(){
            cout<<"Tak se podivejme co se da najit po kapsach.../n Usopleny kapesniky, svaby a karamelky nepocitam.";
            int i;
            for(i=0; i< this->m_inv.size(); i++){
                cout<<i<<": "<<this->m_inv[i]->vratNazev()<<endl;

            }

        };
};
class Prase{
private:
Inventar * m_inv;
public:
void provedAktivitu(Postava * po){
m_inv = new Inventar("Prase",3);
po->pridejPredmet(m_inv);
}
};
int main()
{
    Postava * Hero = new Postava();
    Prase * chro = new Prase();
    chro->provedAktivitu(Hero);
    Hero ->vypisInventar();
    return 0;
}
Název: Re:C++ vektor
Přispěvatel: Martin - ViPEr*CZ* 09 Prosince 2011, 20:46:51
Jo a mám pravdu: http://www.cplusplus.com/reference/stl/vector/vector/

Kdybys to chtěl opravdu jinak, tak je správné řešení vlastní alokátor (tak nějak tipuji).

Taky jsem psal v cpp rpg hru. Je to docela těžké, protože to chce velkou praxi (právě kvůli těm referencím a pointrům).

??? do vectoru se nesmí pushnout dynamickej alokovanej objekt, ale statickej? :o Jsem si vždy myslel, že to je fuk... a klidně objekty posílal. S čím si to vždy ale neporadí je to, že budu ukládat do vectoru structuru a v té struktuře bude další vector s tou samou strukturou... takovej tree vlastně... a každá struktura má navíc v sobě iterátor na pole nadřazené (první prvek toho pole). To jak se zanoří párkrát a je těch položek docela dost (řekněme více jak 1000 a méně jak 10 000), tak to vždy kleklo. Nooo nejsem takovej guru teda... ale nemožnost dávat do vectoru objekty by bylo docela o ničem.
Název: Re:C++ vektor
Přispěvatel: Kedrigern 10 Prosince 2011, 22:12:19
Tak jsem hledal a asi jsem se spletl. Nejspíše s tím, že se nemá dělat pointer na samotný vector,. Např: vector<vector<int> * >, omlouvám se za zmatení.
Název: Re:C++ vektor
Přispěvatel: Pana_Ruplahlava 10 Prosince 2011, 22:14:57
doteď nechápu proč do rozhození do tříd se to chová jinak než když je to v jednom. musel jsem to vyžešit přes klasický pole a to není to co jsem chtěl :-/