Article View: pl.comp.objects
Article #15264Re: Projekt obiektowy do napisania w C
From: Sektor van Skijlen
Date: Tue, 29 Aug 2006 17:25
Date: Tue, 29 Aug 2006 17:25
70 lines
3978 bytes
3978 bytes
Dnia Tue, 29 Aug 2006 18:13:06 +0200, Kurciok skrobie:
> Mam projekt obiektowy z mnustwem dziedziczeń klas abstrakcyjnych itd. I
> musze to napisać w C w dodatku pod mikrokontroler. Jak się do tego zabrać?
> Jak narazie my?lę aby każd? klase zawrzeć w osobnym pliku. I tam umie?cić
> strukturę i funkcję ktore na niej operuj?. Jak jednak zrobić co? takiego jak
> dziedziczenie itd?
Można, ale niekoniecznie.
Pierwsze, co musisz zrobić, to określić sposób tworzenia obiektów, czyli
funkcję, która utworzy nowy obiekt i zwróci na niego wskaźnik. Dziedziczenie w
takim przypadku możesz zrobić poprzez umieszczenie w swojej strukturze z
polami klasy jednego pola, które będzie typu struktury klasy dziedziczonej. W
takim przypadku będą ci nawet działać wszystkie sprawy typu "wywoływanie metod
z klasy bazowej". Oczywiście będzie to tylko dziedziczenie pojedyncze. No i
oczywiście drugi punkt, ważny w dziedziczeniu, to wywołanie "konstruktora"
klasy bazowej w konstruktorze klasy pochodnej. Z tego względu powinieneś mieć
oddzielną funkcję, która tylko inicjalizuje (czyli odpowiednik konstruktora w
C++).
Możesz to zrobić metodą "udawania C++", czyli w strukturach pola,
funkcjonalność w funkcjach.
Polimorfizm tak samo - robisz tablicę metod dla każdej "klasy" i przy
tworzeniu obiektów zapisujesz wskaźnik na odpowiednią tablicę. W związku z tym
"konstruktor" każdego typu musi mieć możliwość podania mu tego wskaźnika. Np.:
struct A { int a; void** vp; };
struct B { A derived; int b; void** vp; };
void construct_A( A* self, void** vp, int i ) { self->a = i; self->vp = vp; }
A* new_A( int i )
{
void* vo = malloc( sizeof(A) );
A* a = (A*)vo;
construct_A( a, vtable_A, i );
return a;
}
void construct_B( B* self, void** vp, int a, int b )
{
construct_A( self->derived, vp, a );
self->b = b;
}
B* new_B( int x, int y )
{
void* vo = malloc( sizeof(B) );
B* a = (B*)vo;
construct_B( a, vtable_B, x, y );
return a;
}
Nie deklarowałem vtable_A i vtable_B, bo z tym jest trochę zabawy i mi się nie
chce :). To powinny być w każdym razie tablice, w których na określonych
pozycjach są zapisane wskaźniki do funkcji "implementacji".
Metody wirtualne definiujesz w ten sposób, że tworzysz funkcję, która
wyciągnie odpowiedni wskaźnik z tej tablicy vp, zrzutuje go na swoją
sygnaturę, i wywoła. Te forwardery potrzebujesz zdefiniować tylko raz.
Przedefiniowanie metod wirtualnych polega na tym, że wpisujesz odpowiednie
elementy do vtable danej klasy - te, które pozostawiasz w spokoju, kopiujesz z
vtable klasy bazowej, a te, które chcesz przedefiniować wpisujesz ręcznie.
--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"I am allergic to Java because programming in Java reminds me casting spells"
Technical Details
Message-ID:
<ed1t9q$sf4$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mailReferences:
<ed1p3b$ohb$1@atlantis.news.tpi.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.objects
Subject: Re: Projekt obiektowy do napisania w C
Date: Tue, 29 Aug 2006 17:25:14 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 70
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <ed1t9q$sf4$1@kujawiak.man.lodz.pl>
References: <ed1p3b$ohb$1@atlantis.news.tpi.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1156872314 29156 212.191.89.2 (29 Aug 2006 17:25:14 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Tue, 29 Aug 2006 17:25:14 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit