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

tworzenie wektora typu własnej klasy, bez deklarowania obiektów tej klasy

Object Storage Arubacloud
0 głosów
459 wizyt
pytanie zadane 6 lipca 2018 w C i C++ przez plebaniahobbitanow Początkujący (470 p.)

Witam, od dłuższego czasu zastanawiam się jak rozwiązać ten problem i już nie jeden program napisałem przez to brutalnie... Sprawa wygląda tak chce mieć wektor typu mojej klasy nazwijmy ją... klasa i nie chcę ręcznie dodawać do niego wcześniej zdeklarowane już obiekty, tylko za pomocą komendy push_back(), chcę żeby obiekt/kontener czy coś w tym stylu laugh, został stworzony automatycznie. Spróbuje to zobrazować krótkim kodem wink

 

Tak robię teraz

#include <vector>
class klasa
{
...
};
int main()
{
vector<klasa> wektor
klasa obj;
wektor.push_back(obj);
}

A chciałbym żeby to wyglądało jakoś tak (kod raczej nie ma prawa działać, fantazjuje sobie XD)

#include <vector>
class klasa
{
...
};
int main()
{
vector<klasa> wektor;
wektor.push_back(new klasa);
}

chciałbym poznać jakieś analogiczne rozwiązanie przede wszystkim dlatego, że vectora używa się zazwyczaj kiedy nie wie się jakiej będzie on wielkości, co oznacza że nie wiadomo ile będzie trzeba stworzyć obiektów naszej klasy, a dynamiczne alokowanie tablicy obiektów potem przepisywanie jej do pomocniczej tablicy, zapominanie pierwotnej, alokowanie jej ponownie w rozmiarze o 1 większym i przepisywanie jej z powrotem, jest wyjątkowo brutalne, wkurzające i nudne...

Z góry dziękuję za każdą odpowiedź smiley

1 odpowiedź

+1 głos
odpowiedź 6 lipca 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 6 lipca 2018 przez plebaniahobbitanow
 
Najlepsza

Chodzi o to?

wektor.push_back(klasa{/*argumenty dla konstruktora gdy potrzebne*/});

Oczywiście są różne odmiany tego sposobu, można użyć emplace_back, czasem można opuścić nazwę klasy, albo użyć () zamiast {}

komentarz 6 lipca 2018 przez plebaniahobbitanow Początkujący (470 p.)

Ooo dokładnie wielkie dzięki działa. Ale mam jeszcze jedno pytanie jeżeli ten wektor jest typu klasy bazowej dla polimorfizmu, to jak mu analogicznie dodać komórkę z klasą pochodną? chodzi mi o taką sytuację

#include <vector>
#include <iostream>
using namespace std;
class bazowa
{
virtual void metoda()=0;
..
}

class pochodna :public bazowa
{
void metoda()
 {
 cout<<"test";
 }
};
int main()
{
vector<bazowa*> wektor;
wektor.push_back(pochodna); //nie dziala :/
}

 

komentarz 6 lipca 2018 przez monika90 Pasjonat (22,940 p.)

Jak tak, to musisz mieć wektor wskaźników, najlepiej inteligentnych, czyli std::unique_ptr. Klasa podstawowa musi mieć destruktor wirtualny, a obiekty tworzysz za pomocą new, lub lepiej std::make_unique

std::vector<std::unique_ptr<bazowa>> v;

v.push_back(std::make_unique<pochodna>(/*tutaj argumenty dla konstruktora*/));

unique_ptr znajduje się w nagłówku <memory>

komentarz 6 lipca 2018 przez plebaniahobbitanow Początkujący (470 p.)

przy próbie stworzenie wektora wskaźników inteligentnych

using namespace std;
(...)
vector<unique_ptr<bazowa>> wektor;

wywala mi unique_ptr was not declared in this scope, pomimo ze code blocks mi podpowiada skłądnię :/

komentarz 6 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Może masz stary kompilator, albo nie włączyłeś współczesnego standardu. Dla unique_ptr musisz mieć co najmniej C++11, a dla make_unique C++14. Gdzieś w opcjach CodeBlocks powinna być możliwość włączenia tego.
komentarz 6 lipca 2018 przez plebaniahobbitanow Początkujący (470 p.)

Faktycznie mój kompilator nie wspierał nawet c++11, ale poczytałem trochę i dodałem nową flagę -std=c++14. teraz unique_ptr działa, ale kiedy próbuje

guziczki.push_back(make_unique<button_test>);

wywala mi błąd

error: no matching function for call to ‘std::vector<std::unique_ptr<button> >::push_back(<unresolved overloaded function type>)

komentarz 6 lipca 2018 przez plebaniahobbitanow Początkujący (470 p.)

Dobra przepraszam głupi błąd powinno być

guziczki.push_back(make_unique<pochodna>());

ale po dodaniu takiej komórki mogę korzystać z metod klasy bazowej, ale przy próbie skorzystania z metod klasy pochodnej program protestuje i kompilator wywala class pochodna has no member named 'nazwa funkcji w klasie pochodnej'

Podobne pytania

0 głosów
3 odpowiedzi 1,349 wizyt
pytanie zadane 17 maja 2018 w C i C++ przez giedymin33 Początkujący (290 p.)
0 głosów
1 odpowiedź 470 wizyt
pytanie zadane 27 maja 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 1,540 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez mIKY Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...