Klasa vector - problem

0

Witam,

Mam następujący problem:
Jak w mojej klasie osiedle zawrzeć wektor (vector <dom*>), gdzie dom to też moja własna klasa z różnymi typami.
Jak to się deklaruje i jak można się później do tego odwołać?

Pozdrawiam

0

Normalnie, dajesz ów vector jako zmienną składową, odwołujesz się też najnormalniej w świecie :D

 class Foo {};
class Bar
{
 public:
  Foo* getLast() {return vect.back();}
 private:
 std::vector<Foo*> vect;
};
0

No dobrze, ale jak np. dodawać wektory do takiej klasy?
Mam z tym duży problem. Próbuję zrobić to przez funkcje, ale tych funkcji w ogóle tak jakby nie było widać. Ktoś wie czemu?

class dom{
 
 int posX, posY;
 char* homeName;
 char* homeDescription;
         
};

class osiedle{

 private:
 std::vector <dom*> domek;
 
 public:
 int posX, posY;
 char* name;
 void addHome(dom* p);
 int vectorCount() { return domek.size(); }
 airplane* getLast() {return domek.back();}

};

void tower::addHome(dom* p) {  domek.push_back(p); }
0
class dom{
 ...         
};

class osiedle{
...
 void addHome(dom* p);
 int vectorCount() { return domek.size(); }
 airplane* getLast() {return domek.back();} //co za 'airplane'? przeciez 'domek' to 'vector<dom*>'

};

void tower::addHome(dom* p) {  domek.push_back(p); }  //co za 'tower'? przeceiz addHome jest w 'osiedle'

co rozumiesz przez 'dodawac wektory do klasy'?
oraz przez 'zrobic to przez funkcje'?
oraz 'tak jakby nie bylo widac' ?

0
class dom{
 ...         
};

class osiedle{
...
 void addHome(dom* p);
 int vectorCount() { return domek.size(); }
 dom* getLast() {return domek.back();} };

void osiedle::addHome(dom* p) {  domek.push_back(p); }  

Sorrka, ale zmieniałem przykład aby pasował do tego przykładu z osiedlem co napisałem na początku, a później robiłem coś innego...

co rozumiesz przez 'dodawac wektory do klasy'?

  • o ile wiem to wektor to coś ala tablica dynamiczna, chodzi o to że chce dodawać elementy do tego wektora. W tym wypadku typem wektora jest klasa, więc chcę budować to osiedle poprzez dodawanie kolejnych domków.

oraz przez 'zrobic to przez funkcje'?
może nie przez funkcję, tylko przez metodę. Na tej zasadzie co metoda addHome(dom* p) - tylko problem w tym, że nie wiem czy ona jest poprawna.

oraz 'tak jakby nie bylo widac' ?
bo ja sam widzisz tą metodę już zadeklarowałem, a ona nie działa i poza tym jej nie widać gdy wcisnę kropkę po nazwie klasy (w "podpowiedziach" innych klas widzę metody)...

0
  1. podpowiedziami sie nie sugeruj.. czasem niektore calkowicie poprawne konstrukcje sa blednie parsowane przez podpowiadacz i ow nie wylapuje danej rzeczy.. jak chcesz miec pewnosc - uzyj tej metody i pusc kompilacje. jak bedzie zle to bedziesz mial pewnosc ze jest cos z nia zle. w Twoim przypadku podpowiadacz jej nie widzial, najprawdopodobniej poniewaz bylo tower:: i "metoda sie umiescila" w klasie tower zamiast osiedle..

  2. addHome jest poprawna, zakladajac ze miala dopisywac jeden podany z zewnatrz wskaznik na dom do trzymanego przez obiekt vector<dom*> :)

  3. ok, teraz juz jasne. ten fragment co wyslales po poprawkach jest poprawny

0
quetzalcoatl napisał(a)
  1. addHome jest poprawna, zakladajac ze miala dopisywac jeden podany z zewnatrz wskaznik na dom do trzymanego przez obiekt vector<dom*> :)

  2. ok, teraz juz jasne. ten fragment co wyslales po poprawkach jest poprawny

Tak to jest poprawne, ale jak przesłać ten wskaźnik, aby to dopisanie działało. Bo ja próbuje już bardzo różnie i nic mi nie wychodzi.
Podaj jak możesz przykład użycia tego w poprawny sposób, aby wskaźnik klasy przesyłanej był dopisywany do tego vectora.

Mam jeszcze jedno pytanie:
Jak według Ciebie/Was lepiej jest przekazywać tą klasę przez wskaźnik jak obecnie czy może zwyczajnie przekazywać całą klasę poprzez parametr bez *.
Jaka jest różnica? Czy zachodzi jakaś zależność?

Pozdrawiam

0

Przy przekazywaniu przez wartość obiekt musi być kopiowany, co powoduje niepotrzebny narzut. To już lepiej przez referencję ;) Tyle, że przecież i tak w vectorze przechowujesz wskaźniki, więc nie ma sensu przekazywać mu obiektów inaczej - no chyba, że chcesz mieć wskaźniki do zmiennych automatycznych, jak tak to powodzenia życzę :P :D

0

Rozumiem.
Jeszcze jakbym mógł prosić o poprawny przykład użycia tej metody dodawania do vektora przez wkaźnik z powyższego przykładu.

Z góry dzięki!

0

osiedle o;
o.addHome(new dom);
delete o.getLast();

0

Wszystko ekstra, tylko mam jeszcze jeden problem.
Jak w dowolnym elemencie vectora w klasie osiedle zmienić jakąś wartość, w tym wypadku wartość z klasy dom???

0

zrobiłem tak:

osiedle os1;

os1.addHome(new dom);
delete os1.getLast();

os1.domy[0]->x = 4;

czy takie odwołanie jest ok?

0

zakladajac ze po linijce delete os1.getLast(); w vector jeszcze pozostaly jakies elementy, oraz ze domy to nazwa publicznej zmiennej typu vector<dom*> w kalsie osiedle, to tak - os1.domy[0]->x = 4; jest absolutnie poprawne

0

Ja bym polecał najpierw przeczytać jakąś książkę/kurs c++ ;)

0
quetzalcoatl napisał(a)

zakladajac ze po linijce delete os1.getLast(); w vector jeszcze pozostaly jakies elementy, oraz ze domy to nazwa publicznej zmiennej typu vector<dom*> w kalsie osiedle, to tak - os1.domy[0]->x = 4; jest absolutnie poprawne

No właśnie, zastanawiam się dlaczego po linijce delete os1.getLast(); w vector da się zapisać do zmiennej x: os1.domy[0]->x = 4;
Kompilator to przyjmuje i oczywiście zapisuje tą czwórkę.
Więc co on usuwa skoro ten ostatni (jedyny) element dalej istnieje...?

Mam jeszcze jedno pytanie:
Jeżeli chcę np. przypisywać wartości do poszczególnych elementów vectora pochodzącego od klasy dom za pomocą metod to gdzie mam te metody umieszcać? W klasie osiedle czy w klasie dom?

np. metoda:

void setHomeName(char* name) {
strcpy(this->name, name);
}

bo this->name to zmienna z klasy dom...

0

Można tak:

class dom
{
public:
 string homeName;         //<------ używaj stringów!!!
 string homeDescription;
};


class osiedle
{
private:
   vector <dom*> domek;

public:
    ...
    dom& operator[](int index){return *domek.at(index);}
};

// użycie

osiedle o;
...

o[10].homeName="dom nr. 10";
//itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1