[ Pobierz całość w formacie PDF ]
Poniżej znajduje się prosty program pokazany wcześniej w C# i VB,
a tym razem wyrażony w C++/CLI. Semantyka jest w zasadzie taka
sama jak poprzednio. Zmieniła się jedynie składnia, w której semantyka
ta została wyrażona.
// Przykład C++/CLI
interface class IMath
{
int Factorial(int f);
double SquareRoot(double s);
};
ref class Compute : public IMath
{
public: virtual int Factorial(int f)
{
int i;
int result = 1;
for (i=2; i
result = result * i;
return result;
};
public: virtual double SquareRoot(double s)
{
return System::Math::Sqrt(s);
}
};
void main(void)
138 Języki .NET
{
Compute ^c = gcnew Compute;
int v;
v = 5;
System::Console::WriteLine(
"{0} silnia: {1}",
v, c->Factorial(v));
System::Console::WriteLine(
"Pierwiastek kwadratowy z {0}: {1:f4}",
v, c->SquareRoot(v));
}
C++/CLI Pierwszą kwestią, na którą warto zwrócić uwagę, jest podobieństwo
przypomina C#
tego przykładu do wersji w C#. Większość podstawowej składni oraz
wiele operatorów jest takich samych. Występują także różnice, które
rozpoczynajÄ… siÄ™ do instrukcji #define, potrzebnej do tworzenia kodu
zarządzanego w C++. Po niej, tak jak poprzednio, następuje definicja
interfejsu IMath. Tym razem jednak wykorzystane są słowa kluczowe
interface class, opisane powyżej. Wynikiem jest inkarnacja interfejsu
zdefiniowanego w CTS w C++.
Klasa CTS jest Następnie pojawia się klasa Compute, która implementuje interfejs IMath.
definiowana za
Klasa ta jest poprzedzona słowem kluczowym C++/CLI ref class,
pomocÄ… ref class
oznaczającym, że jest to klasa referencyjna CTS, której czas życia jest
zarządzany przez CLR za pomocą czyszczenia pamięci. Sama klasa
różni się nieco, jeśli chodzi o składnię, od przykładu w C#, ponieważ
C++ nie wyraża wszystkiego dokładnie w ten sam sposób. Tym niemniej
jest ona bardzo podobna.
Obiekty typów Przykład kończy się standardową funkcją C++: main. Tak jak w po-
referencyjnych
przednich przykładach, tworzy ona obiekt klasy Compute, a następnie
sÄ… tworzone
wywołuje jego dwie metody wszystko to za pomocą standardowej
za pomocÄ… gcnew
składni C++. Najbardziej widoczną różnicą pomiędzy tymi dwoma
przykładami (i pomiędzy standardowym C++) jest użycie słowa klu-
czowego gcnew. Słowo to oznacza, że tworzony jest obiekt klasy CTS
(to znaczy klasa, która będzie poddana procesowi czyszczenia pamięci,
inaczej garbage-collected class stąd gc w gcnew). Innymi słowy,
klasa Compute jest tworzona na stercie zarzÄ…dzanej przez CLR, a nie na
wbudowanym stosie, utrzymywanym przez C++. Obiekty, które po-
wstały za pomocą standardowego operatora C++ new, są tak jak
zawsze tworzone na wbudowanym stosie.
C++ 139
Inną różnicą jest pojawienie się w deklaracji klasy Compute symbolu ^, Referencje
do klasy CTS
po angielsku popularnie zwanego caret lub hat, a po polsku daszkiem.
odbywajÄ… siÄ™
Standardowy C++ do wskazania referencji używa tradycyjnej gwiazdki.
za pomocÄ…
By można jednak było od razu zauważyć, że w grę wchodzi typ referen-
uchwytów
cyjny CTS, w C++/CLI wprowadzono pomysł uchwytu (ang. handle).
Uchwyt taki jak zadeklarowany powyżej, identyfikowany przez ten
nowy symbol, może czasami być wykorzystywany w sposób podobny
do zwykłych wskazników C++, jakie pokazano w wywołaniach Facto-
rial i SquareRoot w dalszej części programu. Ponieważ jednak uchwyt
jest tak naprawdę referencją do obiektu, który będzie pózniej poddany
czyszczeniu pamięci na stercie zarządzanej przez CLR, w rzeczywistości
różni się on od zwykłego wskaznika C++. Nowa składania podkreśla
tę różnicę. I jak można by oczekiwać, wynik dla powyższego przykładu
będzie taki sam jak poprzednio: będzie to silnia oraz pierwiastek kwa-
dratowy z pięciu.
Typy w C++/CLI
C++/CLI pozwala na pełny dostęp do .NET Framework, w tym także Kod zarządzany
i kod niezarzÄ…-
do typów zdefiniowanych przez CLR. Należy zauważyć, że kod zarzą-
dzany w C++
dzany oraz niezarządzany, a także klasy zdefiniowane z ref i bez niego
mogą współ-
mogą być definiowane w tym samym pliku i mogą współistnieć w jed-
egzystować
nym działającym procesie. Jednak jedynie klasy zarządzane są podda- w procesie
wane czyszczeniu pamięci; klasy niezarządzane muszą być jawnie
zwalniane, tak jak siÄ™ to zwykle odbywa w C++. Tabela 3.3 pokazuje
[ Pobierz całość w formacie PDF ]