• 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

42 Warsaw Coding Academy
0 głosów
2,326 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 3,092 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
1 odpowiedź 1,298 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 25 stycznia 2021 w C i C++ przez hicodyn Początkujący (420 p.)

93,377 zapytań

142,380 odpowiedzi

322,529 komentarzy

62,727 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...