🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #15264

Re: Projekt obiektowy do napisania w C

#15264
From: Sektor van Skijlen
Date: Tue, 29 Aug 2006 17:25
70 lines
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-mail
References: <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