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

Dynamiczne tworzenie obiektów C++

Object Storage Arubacloud
+1 głos
4,515 wizyt
pytanie zadane 10 września 2017 w C i C++ przez Helmik Użytkownik (680 p.)
Niedawno zadawałem pytanie, jak dynamicznie stworzyć obiekt. Otrzymałem odpowiedź, że kod jest bardziej  chaotyczny. Zacząłem pisać od nowa, wcześniej planując. Może mi jednak ktoś odpowiedzieć, jak dynamicznie stworzyć te obiekty ;) ?

Plik .h: https://pastebin.com/S2ATe5Zs

Plik .cpp: https://pastebin.com/AfpwqkUJ

Z góry dzięki :D
komentarz 10 września 2017 przez Knayder Nałogowiec (37,640 p.)
No dobra, stworzysz dynamicznie, ale gdzie ty to przechowasz, żeby ci nie uciekło?
Musisz zrobić jakiś kontener. (vector, array, map)
komentarz 10 września 2017 przez Helmik Użytkownik (680 p.)
Czy tworząc tablicę muszę zadeklarować od razu jej liczbę? Mogę to zrobić dynamicznie?
komentarz 10 września 2017 przez Helmik Użytkownik (680 p.)
Wiem, że coś takiego jest
komentarz 10 września 2017 przez Helmik Użytkownik (680 p.)
Robiłem kurs Zelenta, no sorry

1 odpowiedź

+2 głosów
odpowiedź 10 września 2017 przez Knayder Nałogowiec (37,640 p.)
Dynamicznie stworzona tablica, ma zdefiniowany rozmiar tylko raz, na początku.
Polecam poszukać w google informacji pod hasłem c++ vector
Możesz poczytać np. tutaj:
http://en.cppreference.com/w/cpp/container/vector

W skrócie, w wektorze możesz dodawać i usuwać elementy według uznania.
komentarz 10 września 2017 przez Helmik Użytkownik (680 p.)
Danke danke
komentarz 12 września 2017 przez Helmik Użytkownik (680 p.)
Dobra, a jeśli bym chciał zrobić to deklarując z góry ilość elementów w tablicy? Mam stworzyć 3 osobne tablice klas GoldMine, StoneMine, ChopperHut?
komentarz 12 września 2017 przez Knayder Nałogowiec (37,640 p.)

Jeżeli każda z tych klas dziedziczy po jednej klasie, to możesz zrobić coś takiego jak wskaźnik polimorficzny.
 

#include <iostream>

class BaseClass {
public:
	virtual void func() {
		std::cout << "Hello!\n";
	}
};


class ClassA : public BaseClass {
	void ownFunc() {
		std::cout << "Im ClassA!\n";
	}
public:
	virtual void func() override {
		ownFunc();
	}
};


class ClassB : public BaseClass {
	void ownFunc() {
		std::cout << "Im ClassB!\n";
	}
public:
	virtual void func() override {
		ownFunc();
	}
};


int main()
{
	const unsigned int tabSize = 2;
	BaseClass *tab[tabSize];
	tab[0] = new ClassA;
	tab[1] = new ClassB;
	
	for(int i = 0; i < tabSize; i++) {
		tab[i]->func();
	}


	
	std::cin.get();
	for(int i = 0; i < tabSize; ++i)
		delete tab[i];
	return 0;
}
Im ClassA!
Im ClassB!

 

komentarz 17 grudnia 2017 przez MeadHorn Nowicjusz (200 p.)
Witam

Jako noob mam 2 pytania: Czy dostęp do takich dynamicznie tworzonych obiektów zapisanych w wektorze nie będzie przypadkiem zbyt wolny i czy nie byłoby dobrze utworzyć równolegle drugiego wektora, który będzie zawierał same wskaźniki do tych obiektów z pierwszego?

I drugie - co się dzieje z zawartością komórki wektora o danym indeksie, jeżeli na przechowywanym tak obiekcie użyjemy destruktora?
komentarz 17 grudnia 2017 przez Knayder Nałogowiec (37,640 p.)

Jeżeli potrzebujesz dynamicznie alokowanych obiektów, to zrób po prostu wektor wskaźników danego typu.
 

std::vector<int*> vec;
vec.push_back(new int(15));

vec[0]; <- Wskaźnik na tego inta.


for(auto& it : vec)
    delete it;

 

komentarz 27 grudnia 2017 przez MeadHorn Nowicjusz (200 p.)
Dzięki, Knayder, ale tu podajesz prosty przykład - vector intów, które zawsze zajmują 4 bajty tak że inkrementacja wskaźnika o 1 zawsze poprowadzi nas do kolejnej komórki. A jak się sprawa ma z wektorami obiektów, które są złożonymi strukturami danych, same w sobie mogą zawierać jakieś stringi, lub inne vectory, które mogą być różnej długości, a jeszcze mamy tak jak w Twoim przykładowym kodzie klasę bazową i różne klasy pochodne , które też mogą między sobą się różnić ilością zmiennych. Czy przy tak zróżnicowanej zawartości komórek wskaźniki będą działać poprawnie?
komentarz 27 grudnia 2017 przez mokrowski Mędrzec (155,460 p.)

Sprawdź poprzez sizeof() elementu czy wskaźnik int'a i wskaźnik na dany obiekt ma inną wielkość. Podpowiem. Wskaźnik to adres. Ten na platformie jest tej samej wielkości :-)

#include <iostream>

struct X {
    std::string rabish1;
    float pank;
    int other_data;
};

int main() {
    X x;
    int value = 1410;
    std::cout << "X pointer sizeof = " << sizeof(&x) << '\n'
        << "int pointer sizeof = " << sizeof(&value) << '\n';
}

PS. Wskaźnik nie zawsze zwiera się w 4 bajtach. Na maszynach 64-bit, będzie często 8 bajtowy :-)

komentarz 30 grudnia 2017 przez Knayder Nałogowiec (37,640 p.)
Dokładnie. Struktury zawsze mają stałą wielkość. Zauważ że wszystko co dynamiczne, alokowane jest na wskaźniku, którego wielkość jest stała. std::string ma w sobie wskaźnik na ciąg znaków.

Podobne pytania

0 głosów
1 odpowiedź 1,531 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez mIKY Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 1,343 wizyt
pytanie zadane 17 maja 2018 w C i C++ przez giedymin33 Początkujący (290 p.)
0 głosów
1 odpowiedź 621 wizyt

92,555 zapytań

141,402 odpowiedzi

319,550 komentarzy

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

...