• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie obiektów do wektorów

Object Storage Arubacloud
0 głosów
2,007 wizyt
pytanie zadane 22 kwietnia 2016 w C i C++ przez niezalogowany

//Builder

Witam, znalazłem w internecie sposób na zapisanie obiektu  poprzez dodanie go do wektora w chwili tworzenia:

vec.push_back( new obiekt );

Jednak jest problem... nie wiem czy wynika to z tego, że wektor jest przekazywany jako parametr funkcji (choć niemożliwe O.o) czy co, jednak wyskakuje mi taki błąd:

[C++ Error] Unit1.cpp(208): E2316 'push_back' is not a member of 'Slime'​

kod klasy:

class Slime : public TImage
{
private:

      //  AnsiString AText;
        //void __fastcall SetAText(String tekst);
protected:

public:
           std::vector < Slime > tab;
        Slime( int left = -80, int top = 8);
        __fastcall ~Slime(void);
        friend  void generator(Slime tab);

__published:

};
//--------------------------------

 

kod konstruktora i funkcji. Błąd wyrzuca ta linijka:    tab.push_back(new Slime);​

  Slime::Slime( int left, int top)
  :TImage(Owner)
  {
   this -> Left = left;
   this -> Top = top;
   this -> Picture -> LoadFromFile("img/Slimeball.bmp");
  }
//----------------------------------------------------------------------------
  void generator(Slime tab){
   tab.push_back(new Slime);
  }

 

2 odpowiedzi

+1 głos
odpowiedź 22 kwietnia 2016 przez Radfler VIP (101,030 p.)
wybrane 22 kwietnia 2016
 
Najlepsza
void generator(Slime tab){
   tab.push_back(new Slime);
}

Parametr funkcji przesłania składową klasy tab. Próbujesz wywołać funkcję push_back na obiekcie typu Slime, co jest błędem. Rozwiązaniem może być jawne użycie this:

void generator(Slime tab){
   this->tab.push_back(new Slime);
}
komentarz 22 kwietnia 2016 przez niezalogowany

[C++ Error] Unit1.cpp(208): E2297 'this' can only be used within a member function​

this przecież oznacza dany obiekt a skąd funkcja spoza klasy moze wiedzieć o co mi chodzi przez this? I właśnie ten błąd się pokazuje

komentarz 22 kwietnia 2016 przez Radfler VIP (101,030 p.)

Aaaa, nie zauważyłem. Dobra, taki zapis powinien być prawidłowy:

void generator(Slime tab){
   tab.tab.push_back(new Slime);
}
komentarz 22 kwietnia 2016 przez niezalogowany

Nie wiem czemu ale także nie działa

[C++ Error] Unit1.cpp(208): E2285 Could not find a match for '_STL::vector<Slime,_STL::allocator<Slime> >::push_back(Slime *)'​

komentarz 22 kwietnia 2016 przez Radfler VIP (101,030 p.)

Nie działa, gdyż wektor przechowuje zmienne typu Slime, a ty próbujesz dodać obiekt typu Slime*. Zmień typ wektora na:

std::vector<Slime*> tab;
komentarz 22 kwietnia 2016 przez niezalogowany

Dzięki, działa, a wytłumaczysz mi czemu  trzeba było napisać tab.tab.push_back(new Slime);

zamiast tab.push_back(new Slime); ? Skąd te podwojenie początku?

komentarz 22 kwietnia 2016 przez Radfler VIP (101,030 p.)
void generator(Slime tab){
 tab.tab.push_back(new Slime);
}

W tym fragmencie kodu zmienna tab jest typu Slime. W takim zapisie

tab.tab

odwołujesz się do składowej tab w obiekcie tab, czyli w naszym przypadku do wektora. A tu:

tab.tab.push_back(/* ... */)

Wywołujesz funkcję składową push_back na rzecz tego wektora.

komentarz 22 kwietnia 2016 przez niezalogowany

Ale jestem beznadziejny... sieczka mi się powoli robi. Dziękuje za pomoc, dużo załapałem ale czuje, że wyłożyłem się na rzeczy ,która jest banalna a właśnie nie potrafie tego przemóc... a mianowice

  void generator(Slime tab){
   tab.tab.push_back(new Slime);
  }

mam ten kod, tylko jak teraz się do niego odwołać? No bo jak zrobię chociażby timer i w nim będzie

     generator(Slime tab);

(uprzednio zaprzyjaźniłem go z  klasą) no to błedy typu:

[C++ Error] Unit1.cpp(217): E2108 Improper use of typedef 'Slime'

[C++ Error] Unit1.cpp(217): E2121 Function call missing )

Z drugiej strony pomyślałem by już typowo w timerze sie wszystko działo, ale czego bym nie robił, zmieniał argumenty w .cpp, w klasie i w nagłówku TForm1 to i tak wyskakują błędy. Czy pokierujesz mnie? Ktoś jest wstanie wytłumaczyć zielonemu? :(

0 głosów
odpowiedź 22 kwietnia 2016 przez niezalogowany

nie chcę śmiecić następnymi tematami więc przekopiuję odpowiedź z komentarza jako post by odświerzyć:

 

Ale jestem beznadziejny... sieczka mi się powoli robi. Dziękuje za pomoc, dużo załapałem ale czuje, że wyłożyłem się na rzeczy ,która jest banalna a właśnie nie potrafie tego przemóc... a mianowice

  void generator(Slime tab){
   tab.tab.push_back(new Slime);
  }

mam ten kod, tylko jak teraz się do niego odwołać? No bo jak zrobię chociażby timer i w nim będzie

     generator(Slime tab);

(uprzednio zaprzyjaźniłem go z  klasą) no to błedy typu:

[C++ Error] Unit1.cpp(217): E2108 Improper use of typedef 'Slime'

[C++ Error] Unit1.cpp(217): E2121 Function call missing )

Z drugiej strony pomyślałem by już typowo w timerze sie wszystko działo, ale czego bym nie robił, zmieniał argumenty w .cpp, w klasie i w nagłówku TForm1 to i tak wyskakują błędy.  Ktoś jest wstanie wytłumaczyć zielonemu? :(

Podobne pytania

0 głosów
2 odpowiedzi 2,727 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
1 odpowiedź 916 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 25 stycznia 2021 w C i C++ przez hicodyn Początkujący (420 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...