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
toz ci kurwa napisali
przeczytaj sobie jak dziala new i delete
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
jak widac z wyzej wymienionego linku chodzilo mu o obiekty
Montero siedz cicho. Moge mu pomoc, jak tylko sprecyzuje pytanie.
Eledhwen, funkcja malloc() jest jest z programowania proceduralnego, a nie obiektowego.
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.
#5 ale ja nie chce deklarować z góry ilości osób
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.
Vector jest po prostu zajebisty :) najfajniejsza rzecz w stl ;]
Ale masakrycznie wolny w porownaniu z listą napisaną ręcznie.
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:)
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.
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.
nie piszemy duzych liter po kropce?;o
#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.htmlZmieniony 2010-01-03 15:49:50 przez Madras
#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
lol nie przecyztalem [c++] i myslalem ze znowu topic o naszej klasei ;D