NETWARS - CZĘSTO ZADAWANE PYTANIA

Zjedź na dół

2008-01-24 19:33:46
[#1] ReaDy
np dla
class osoba
{
string imie;
};
chciałbym utworzyć jedną lub wiecej osób (nie chodzi mi o wpisanie po kolei jak w pętli for )
a następnie wyświetlić listę tych osob i usunąć jedną z nich
2008-01-24 19:45:32
http://tiny.pl/p3wm
;)
2008-01-24 19:45:46
[#3] Monikon
Klas czy obiektow?
2008-01-24 19:47:02
toz ci kurwa napisali
przeczytaj sobie jak dziala new i delete
2008-01-24 19:47:21
[#5] Eledhwen
musisz zrobić tablicę obiektów, czyli deklarujesz wskaźnik:
osoba *lista_osob;
i pózniej jak już wiesz ile tych osób będzie, robisz:
lista_osob = new osoba[x];
i do każdej z osób odwołujesz się jako lista_osob[0], lista_osob[1] itd.
Można to samo zrobić funkcją malloc() ale operator new jest w sumie wygodniejszy - tyle że od razu wywołuje konstruktor dla każdego nowego obiektu, a funkcja malloc nie :o
2008-01-24 19:47:49
jak widac z wyzej wymienionego linku chodzilo mu o obiekty
2008-01-24 19:50:09
[#7] Monikon
Montero siedz cicho. Moge mu pomoc, jak tylko sprecyzuje pytanie.

Eledhwen, funkcja malloc() jest jest z programowania proceduralnego, a nie obiektowego.
2008-01-24 19:54:34
[#8] Monikon
Tablicy obiektów stworzonej za pomocą operatora new, nie mozna zmienic rozmiaru, tak jak mialo to miejsce w C uzywajac funkcjie realloc.

Z mojej strony polecam uzycie jakiegos kontenera, najlatwiejszy jest chyba Vector.
2008-01-24 19:55:17
[#9] ReaDy
#5 ale ja nie chce deklarować z góry ilości osób
2008-01-24 19:57:40
[#10] Monikon
http://pl.wikibooks.org/wiki/C%2B%2B/Vector
2008-01-24 20:05:31
[#11] Eledhwen
no i co z tego że malloc() nie jest obiektowa? w C++ też działa i czasami lepiej jest jej użyć niż "new". A co do tego że nie znasz z góry ilości osób - w lista_osob = new osoba[x]; x może być dowolną zmienną całkowitą (o to w końcu chodzi w dynamicznej alokcaji). A jeżeli ma się to zmieniać w trakcie wykonania programu, to masz kilka opcji: albo zrobić listę łączoną (czyli każdy obiekt zawiera zmienną będącą wskażnikiem na następny obiekt tej klasy), albo za każdym dodaniem/skasowaniem osoby kasujesz starą tablicę i alokujesz nową, albo używasz wyżej wspomnianego kontenera który zrobi to wszystko automatycznie.
2008-01-24 20:10:05
[#12] Spykaj
Vector jest po prostu zajebisty :) najfajniejsza rzecz w stl ;]
2008-01-24 20:16:13
[#13] Nargil
Ale masakrycznie wolny w porownaniu z listą napisaną ręcznie.
2008-01-24 20:58:29
[#14] Kostek:)
Widze ze podobny temat jest wiec sie podlacze.
A wiec mam taki problem. Napisalem sobie funkcje w asm. Chce aby ta funkcja byla odpalona ze stosu. W tym celu tworze funkcje w ktorej deklaruje tablice do ktorej kopiuje moja funkcje napisana w asm. Teraz moment kluczowy a mianowicie tworze sobie wskaznik do funkcji taki:
void (*kupa)(uint32_t,uint32_t,uint32_t);

teraz rzutuje adres 1 elementu tablicy na taki sam wskaznik:
kupa=(void(*)(uint32_t,uint32_t,uint32_t))dupa;

Funkcja napisana w asm powinna pobierc parametry (te ze wskaznika)do rejestrow r0,r1,r2. Jednak tak sie nie dzieje. I teraz pytanie czy dobrze napisalem ten wskaznik oraz rzutowanie??

Zmieniony 2009-12-04 20:59:14 przez Kostek:)

2008-01-24 22:28:39
Srób sobie listę jednokierunkową;p

class osoba
{
string imie;
osoba* next;
};
robisz wskaźnik na 1. a ostatni wskazuje na nulla i koniec problemu.
2008-01-24 22:43:16
Srób o_O ?
2008-01-24 22:45:57
przyjete jest na forach internetowych na calym swiecie- nie
czepiamy sie literowek, spacji, nie piszemy duzych liter po kropce,
i nie uzywamy polskich znakow (nie kazdy je ma, nie wszyscy maja
windows, nie wszyscy sie urodzili w PL).

pozatym w komentarzach sa dozwolone skroty, zaporzyczenia, wyrazy
laczone, nie ma cenzury i liczy sie tylko tresc nie sposob zapisu.

wytykanie stylu zapisu swiadczy o kompletnym braku argumentow,
ignorancji i probie anonimowego dowartosciowania.
2008-01-24 22:55:23
[#18] ilovegame
nie piszemy duzych liter po kropce?;o
2008-01-24 23:06:09
Możesz ale nie musisz.
2008-01-25 15:45:37
[#20] Madras
#17 zapożyczenia

#1 Najprościej Ci będzie użyć stl-oweej klasy "set", robisz to w ten sposób:

#include <set>

potem w kodzie:

std::set<Osoba> zbiorOsob;
zbiorOsob.insert( Osoba( "Jan Kowalski" ) );
itd. (pod warunkiem, że masz napisany konstruktor osoby przyjmujący stringa) (w ten sposób zdefiniowanym secie umieszczana jest kopia Osoby podanej jako argument - nawet jeśli nie wiesz o co chodzi, to przyda się zapamiętać na przyszłość)

Usuwasz:
zbiorOsob.erase( Osoba( "Jan Kowalski" ) );

A żeby wyświetlić listę osób musisz skorzystać z iteratora:
for( std::map<Osoba>::iterator iterator= zbiorOsob.begin(); iterator != zbiorOsob.end(); ++iterator )
{
std::cout << (*iterator).imie;
}

Powinno działać, choć mogłem też popełnić gdzieś jakiś błąd, nie sprawdzałem u siebie.
(na pewno musisz upublicznić składową imię, bo domyślnie jest prywatna)

Więcej na temat set-a możesz poczytać np. tutaj: http://cppreference.com/cppset/index.html

Zmieniony 2010-01-03 15:49:50 przez Madras

2008-01-28 18:59:29
[#21] Spykaj
#13
jesteś pewny ? testując listę jednokierunkową całą napisaną w C i vector w obiektywnych warunkach wyszło mi, że lista działała 4.5 sekundy, vector tylko 3.5 sekundy :d

vector działa szybciej, bo nie potrzebuje ciągle alokować pamięci dla każdego elementu ;d także argument o szybkości do mnie nie przemawia

Zmieniony 2010-04-05 19:01:18 przez Spykaj

2008-01-28 19:07:31
[#22] Shad
lol nie przecyztalem [c++] i myslalem ze znowu topic o naszej klasei ;D
TEMAT ZAMKNIĘTY po 2 tygodniach automatycznie.