🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.answers
Article #275

pl.comp.objects FAQ (Frequently Asked Questions and more)

#275
From: Maciej Pilichowski
Date: Sat, 15 Nov 1997 17:10
821 lines
32153 bytes
Posted-By: auto-faq 3.1.1.2
Archive-name: pl-comp-objects-faq


============================= DRUGA EDYCJA ================================

         FAQ (Frequently Asked Questions and more) pl.comp.objects
                                  * * *
         Moderator - Kuba Chabik, vasquez@sprocket.ict.pwr.wroc.pl

===========================================================================

Data opracowania: 2.05.95 - 16.05.95, Zasoby: 6.12.94 - 12.04.95,
Edycja - Maciej "MACiAS" Pilichowski, macias@vm.cc.uni.torun.pl

                  +-------------------------------------------------------+
                  l - How many programmers does it take to change a bulb? l
                  l - None. It's a hardware problem.                      l
                  l                                             *bulbs*   l
------------------+-------------------------------------------------------+

Material zostal podzielony na sekcje:

I.   Informacje i ciekawostki
II.  Jedynie sluszny slowniczek
III. Pytania i odpowiedzi, sprawy techniczne
IV.  Pytania, na ktore jak na razie nikt nie odpowiedzial

  W znakomitej wiekszosci wszystkie informacje zostaly wziete z listow
uczestnikow grupy. Jesli zauwazycie ponizej bledy, niescislosci, luki,
etc. to bardzo prosze o listy (jesli sprawa nie jest oczywista, to
najlepiej na adres grupy).

  Dziekuje Kubie za przeslanie archiwum i jednoczesnie przepraszam za
dosc dluga realizacje wydania FAQ2.

                                                      MACiAS

  Here we go...

=================================== I =====================================

  Nasze ulubione ksiazki
  ~~~~~~~~~~~~~~~~~~~~~~
  I.Graham, Object-Oriented Methods
  D.Coleman et al, The Fusion Method
  I.Jacobson, Object-Oriented Software Engineering
  M.Badouin-Lafon, Object-Oriented Languages
  J.Rumbaugh et al: Object-Oriented Modelling and Design
  B.Stroustrup, Jezyk C++,
    WNT, ISBN 83-204-1697-3
  P.Coad, E.Yourdon, Analiza obiektowa (OOA),
    README, ISBN 83-85769-17-X
  P.Coad, E.Yourdon, Projektowanie obiektowe (OOD),
    README, ISBN 83-85769-18-8
  Budd, Timothy, An Introduction to Object Oriented Programming,
    Addison Wesley Publishing, ISBN 0-201-54709-0
  Lalonde, W.R. & J.R.Pugh, Inside Smalltalk, Volume 1 and 2,
    Prentice Hall
  B.W.Kernighan, D.M.Ritchie, Jezyk C,
    WNT, ISBN 83-204-1067-3
  R.Jones, I.Stewart, Sztuka programowania w jezyku C,
    WNT, ISBN, 83-204-1414-8
  S.B.Lippman, Podstawy jezyka C++,
    WNT, ISBN 83-204-1681-7
  J.Grebosz, Symfonia C++,
    DMM
  T.Hansen, Zadania z jezyka C++,
    WNT
  E.Kain, Od C do C++,
  M.Kliszewski, Inzynieria oprogramowania obiektowego - analiza obiektowa,
    RESPEKT, ISBN 83-901994-0-8


  Czarna lista
  ~~~~~~~~~~~~
  P.Coad, J.Nicola, Programowanie obiektowe (OOP),
    README
  K.Barteczko, Praktyczne wprowadzenie do programowania w jezyku C++,
    LUPUS

---------------------------------------------------------------------------

  Wydawnictwa i dystrybutorzy
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  WNT - 00-048 Warszawa, Mazowiecka 2/4
        tel/fax 26-82-93
  TOMIK - 03-808 Warszawa, Minska 25
          tel 13-41-45, fax 10-25-83, e-mail tomik@ikp.atm.com.pl
  Helion - 44-100 Gliwice, Pszczynska 89
           tel 38-81-54, fax 38-81-01, skr. poczt. 462
  Intersoftland - 00-874 Warszawa, Ogrodowa 37
                  tel/fax 20-70-04, tel 20-70-01 w.271
  HELP - 04-228 Warszawa, Tytoniowa 20
         tel 613-13-52, fax 613-13-52
  LUPUS - 00-739 Warszawa, Stepinska 22/30
          tel 415-121, 410-031 w.128, fax 410-374
  Lynx-SFT - Warszawa, Maklakiewicza 11/44
             tel/fax 48-30-04
  Translator - 02-088 Warszawa, ul. Batorego 16/133
               tel/fax 25-61-22

---------------------------------------------------------------------------

  Firmy programistyczne
  ~~~~~~~~~~~~~~~~~~~~~

  WATCOM - info@watcom.on.ca
           sales@watcom.on.ca

---------------------------------------------------------------------------

  Ciekawostki z historii C++
  ~~~~~~~~~~~~~~~~~~~~~~~~~~
Autorem C++ jest Bjarne Stroustrup. W swojej ksiazce "The Design and
Evolution of C++" skladajac wyrazy holdu za wplyw na powstanie jezyka C++,
Stroustrup wymienia m.in. nastepujace osoby: Briana Kernighana, Andrew
Koeniga, Douga McIlroya, Jonathana Shopiro. Kristen Nygaard (Simula 67)
i Dennis Ritchie (C) zajmuja na tej liscie miejsca szczegolnie eksponowane.

W pazdzierniku 1979 roku istnial 1 uzytkownik C++ (C z klasami),
w  pazdzierniku  1981 C++ mial 38 uzytkownikow, w dziesiec lat pozniej -
400 000 osob przyznawalo sie do programowania w C++. A obecnie?

Obecnie trwaja prace nad normalizacja jezyka C++, prowadzone przez kilka
cial standaryzacyjnych. Moze jeszcze w tym roku doczekamy sie drugiego,
po ANSI C, standardowego jezyka programowania.

Bjarne Stroustrup od cwiercwiecza interesuje sie - filozofia i historia.
Jego sympatie do empirystow i awersja do idealistow, "uszczesliwiajacych"
ludzkosc "tym, co dla niej dobre" (slowa Stroustrupa), wplynely na
niektore decyzje i rozwiazania projektowe w C++.

==================================== II ===================================

  garbage collector    - odsmiecacz
  operator overloading - przeciazanie operatora
  object persistency   - trwanie obiektu
  persistent pointer   - trwaly wskaznik
  container            - pojemnik
  template             - szablon
  reference            - odnosnik
  dereferencing        - wyluskiwanie

=================================== III ===================================

>>>  Info - uzytkownicy pakietu Watcom C/C++ 32bit wer.10.0.

Na komputerze asic (ftp.ict.pwr.wroc.pl -> pub/lang/watcom-c/) zostaly
umieszczone patche pozwalajace na wykonanie upgrade do wer. 10.0a. Jest
tego ok. 11MB.

---------------------------------------------------------------------------

>>>  Jak w Unixie realizuje sie takie rzeczy jak kolorki /w tekscie/
     i podkreslenia? Czy mozna odczytac znak pod kursorem albo na danej
     pozycji (x,y)? Czy jest jakas funkcja systemowa, ktora zwraca
     rozdzielczosc ekranu /w trybie tekstowym/? Czy jest jakas funkcja
     ustawiaja kursor na danej pozycji?

Do tych celow pod UNIXem sluzy biblioteka o wdziecznej nazwie "curses".
Jej glowna zaleta jest uniezaleznienie programisty od typu terminala
(vt100, wyse50, sun-cmd... Kazdy z nich ma inny kod polecen).

Curses operuje na oknach, ktore tworzy w pamieci. Wszelkie instrukcje
pisania nie wplywaja bezposrednio na zawartosc ekranu, a jedynie na
zawartosc bufora pamieci, ktory odwzorowuje okno. Dopiero wykonanie
"wrefresch(window)" powoduje przepisanie zawartosci bufora na ekran.
Mozna tez zapamietac kawalek ekranu - pod warunkiem, ze jego zawartosc
byla tworzona przez funkcje z "curses", a nie przez "printf".

---------------------------------------------------------------------------

>>>  Jak w prosty sposob zrozumiec opis bledu w BC++?

W okienku "message" najezdzasz na linie bledu, wciskasz klawisz F1,
wtedy w HELPIE pojawi sie opis: kiedy i z jakich najczestszych powodow
taki komunikat sie pojawia. Zaznaczasz ten tekst klawiszami
[shift]+[kursor], kopiujesz przez [ctrl]+[ins], przenosisz do jakiegos
pliku [shift]+[ins], zapisujesz i tlumaczysz ten plik na jezyk polski.

---------------------------------------------------------------------------

>>>  Co zrobic jesli klasa deklarowana w pliku naglowkowym uzywa typow
     deklarowanych w innych plikach naglowkowych?

W _kazdym_ pliku naglowkowym nalezy wpisac:

#ifndef nazwapliku_h
#define nazwapliku_h
...
#endif

I mozesz bezkarnie wlaczac potrzebne ci headery.

---------------------------------------------------------------------------

>>>  Czy jest, a jesli tak, to jak sie nazywa funkcja, ktora wczytuje
     jeden znak bez potwierdzenia?

Trzeba samemu napisac taka procedure...

#include <stdio.h>
#include <termio.h>

termio t_save;

void raw_start()
{
termio t;

  ioctl(0,TCGETA,&t_save);   // zapamietaj aktualne ustawienia

  ioctl(0,TCGETA,&t);        // jeszcze raz, tym razem do modyfikacji

  t.c_lflag &= ~ICANON;      // wylacz tryb buforowany
  t.c_lflag &= ~ECHO;        // wylacz wypisywanie znakow
  t.c_cc[ VMIN ] = 1;        // czytaj po jednym znaku

  ioctl(0,TCSETAW,&t);       // i zapisz wlasnie zmienione ustawienia
};

void raw_end()
{
 ioctl(0,TCSETAW,&t_save);   // przywroc poczatkowe ustawienia
};

void main()
{
char ch;

  raw_start();
  printf("\n Przetestuj klawiature - 'q' - koniec\n");
  while((ch=getchar())!='q')
    putchar(ch);
  raw_end();
};

---------------------------------------------------------------------------

>>>  Co to sa dziwne pliki w katalogu "/usr/g++-include/gen" z
     roszerzeniami ".ccP" oraz ".hP"?

Jest to po prostu biblioteka "libg++". Dowiedziec sie czegos wiecej mozesz
z dokumentacji. A pliki z rozszerzeniem ".ccP" i ".hP" sa wejsciowymy
plikami do programu "genclass". To sa pliki ze starej wersji kompilatora,
ktory nie mial wlaczonych templates, wiec uzywalo sie tego i "genclass"
specyfikujac jaki mial byc bazowy typ, "genclass" tworzyl z tego pliki
np. "<type>Vec.cc" i "<type>Vec.h" zastepujac <T> podanym typem.

---------------------------------------------------------------------------

>>>  Jak w C++ obsluguje sie funkcje ze zmienna liczba parametrow?

W starym C stosowalo sie <varargs.h>, w nowym (ANSI C oraz C++)
stosuje sie <stdarg.h>.

Ponizej przyklad programu wykorzystujacy <stdarg.h>.
 va_list   - typ zmiennej pomocniczej
 va_start  - inicjalizacja listy
 va_argptr - przesuniecie wskaznika listy na nastepny element
________________

#include <stdio.h>
#include <stdarg.h>

void pisz(char *tekst,...)
{
va_list argptr;

  va_start(argptr,tekst);
  printf("\nTo sa dane : %s",tekst);
  while(*(tekst=va_arg(argptr,char *))!=NULL)
    printf(" %s",tekst);
  va_end(argptr);
};

void main()
{
  pisz("ala","ola","kot","domek na prerii","i nic",NULL);
};
________________

Typowo to jest tak, ze pierwszy parametr zawiera informacje o liczbie
dalszych parametrow. Moze to byc liczba, ale moze byc tak jak w "printf":
  printf("zmienna %s = %d",...)
Tu jest podane, ze tylko dwoch parametrow trzeba sie doszukac.

---------------------------------------------------------------------------

>>>  Czy mozna zaimplementowac funkcje wirtualne w C?

Tak - mozna to zrobic poprzez umieszczenie wskaznikow do funkcji razem
z danymi, np:

struct ojciec {
  int daneojca;
  int *funkcjaWirtualna(char *arg);
};

struct syn {
  struct ojciec o;
  int danesyna;
  int *mojaFunkcjaWirtualna();
};

struct syn *konstuktor_syna()
{
  struct syn *s = malloc(...);
  s->mojaFunkcjaWirtualna = syn_mojaFunkcja;
  s->o.funkcjaWirtualna = s->mojaFunkcjaWirtualna; // podmiana wskaznika
                                                   // funkcji wirtualnej
}

czyli poprzez podmiane wskaznika do funkcji. Taka realizacja jednak
umozliwa jednak uzywanie tylko pseudo-wirtualnych funkcji. Jesli chcemy
uzywac naprawde takich funkcji uzyjmy jezyka obiektowego, gdyz w tych
jezykach funkcja/metoda wirtualna wyroznia sie tym, ze niezaleznie od
sposobu wywolania zawsze wykonana zostanie funkcja odpowiadajaca
rzeczywistemu typowi klasy. Tak jak w ponizszym przykladzie:

foobar( struct ojciec *o)
{
  o->mojaFunkcjaWirtualna(); // jesli o jest wskaznikiem na syna
                             // to wywolane zostanie syn_mojaFunkcja
}

---------------------------------------------------------------------------

>>>  Czy jest dostepna darmowa implementacja Smalltalka?

Tak - w ramach GNU. Znalezc go mozna w wiekszosci katalogow z GNU.

---------------------------------------------------------------------------

>>>  Czy sa obiekty tego typu jak okienka i menu w C++ pod Borlandem?
     Jezeli sa takie obiekty to jak je mozna wykorzystac, lub gdzie mozna o
     nich przeczytac? Czy jest jakas biblioteka w C++ podobna do TVISION w
     Turbo Pascalu 6.0? Gdzie mozna zdobyc jakies programy obiektowe, takie
     aby mozna by je uruchomic i sprawdzic na jakiej zasadzie powinno
     to dzialac ?

Dla Borland C++ dostepna jest biblioteka Turbo Vision, bedaca dosc
dokladnym odpowiednikiem TVISION z Turbo Pascala 6.0. Jest ona
sprzedawana przez Borlanda w niektorych szerszych zestawach
kompilatora (C++ and Application Frameworks), jak tez i osobno,
bodajze jako Borland Application Frameworks.

Biblioteka podobna do TVISION jest tez Object Windows Library (OWL) -
z tym, ze sluzy ona do programowania w Windows (co goraco polecam,
chociaz wole biblioteke MFC sprzedawana wraz z Microsoft Visual C++).

OWL 2, wchodzacy w sklad BC++ 4.xx, ma byc juz niedlugo przenosny na
inne platformy, m.in. X11. OWL 2 nie jest taki zly, tylko niestety
w 4.00 mial kupe bledow.

---------------------------------------------------------------------------

>>>  Czy SmallTalk jest dobry w praktyce, czy tylko w teorii?

W przypadku Smalltalka o teorii mogla byc mowa jakies 10 lat temu. Teraz
jest to praktyka. Niejaki Dave Thomas z Kanady odpowiedzial na to
pytanie w bardzo ciekawym referacie. Oto, co wdrozono na Smalltalku:

1. Centrale telefoniczna dla kilkudziesieciotysiecznego miasta.
2. "Zastosowania specjalne".
3. IBM zatrudnil ostatnio (pocz.'94) okolo 300 programistow w Smalltalku.
   Chyba nie do podlewania kwiatkow.
4. System analizy jakosci programow napisanych w C.

Tyle pamietam. Inna sprawa, ze Smalltalk nie dorownuje C++
rozpowszechnieniu, wiec i produkty komercyjne nie sa tak czeste. Ja nie
potrafie podac zadnych, ale w C++ to chyba tez tylko te, w ktorych
pisaniu sam uczestniczylem.

Czytalem, ze zrobienie jednej klasy w Smalltalku zajmuje 1 osobodni, w
C++ trzy razy tyle. Oczywiscie slyszalem to od entuzjastki Smalltalka,
wiec trzeba wziac poprawke.

---------------------------------------------------------------------------

>>>  Czy to prawda, ze aby zainstalowac Borland C++ 4.xx trzeba miec
     Windowsy. Tzn. jest tam nadal DOSowe IDE, ale install.exe na
     pierwszej dyskietce jest juz tylko dla Windows.

Znacznie lepiej - nie ma DOSowego IDE. Jest tylko kompilator dla DOSu,
ale ten "command line".

---------------------------------------------------------------------------

>>>  Jak kompilator generuje konstrukcje "switch"?

Dla bardzo krotkich "switchy" generuje kod z bezposrednimi porownaniami.
Dla dluzszych tworzona jest tabela adresow.

---------------------------------------------------------------------------

>>>  Czy warto kupowac starsze wersje Borland C++?

Nie warto kupowac nic przed wersja 4.5, ktora i tak ma byc drozsza od
Watcoma, a dziala tylko pod dos/windows :-(.

---------------------------------------------------------------------------

>>>  Czy patche do BC++ 4.0 dadza mi wersje 4.02?

Patche sa, i owszem, ale dotycza tylko drobiazgow. Borlad nie daje patchy
jako takich, tylko po prostu nowa wersje 4.02 na kompakcie i niestety
za $$$ - 4.02 jest zupelnie nowa wersja. Przed instalaccja trzeba
wykasowac stara wersje.

---------------------------------------------------------------------------

>>>  Czy istnieje odpowiednik GNU C Unix pod DOSa?

Tak - jest dostepna DOSowa wersja UNIXowego kompilatora GNU C.  Obejmuje
on C, C++, Objective C, yacc, lex, gdb i sporo innych narzedzi.
Generuje kody 32-bitowe i zarzadza pamiecia wirtualna.

Dojscie: oak.oakland.edu (141.210.10.117), katalog /pub/msdos/djgpp.
Ostroznie z transmisja - sa tam ciezkie megabajty roznosci, na ogol
DOSowe kompilaty roznych narzedzi UNIXowych.

---------------------------------------------------------------------------

>>>  Jak i za ile jest dystrybuowany Watcom C/C++?

Watcom C/C++ 10.0a $99 wersja edukacyjna, tylko CDROM, zadnych ksiazek.
Online help na cdromie. Wersja 10.0a jest poprawiona w stosunku do
wersji 10.0.

---------------------------------------------------------------------------

>>>  Jakie sa wymagania sprzetowe i programowe Watcom C/C++?

386DX 4 MB RAM minimum. 8MB zeby dalo sie cos robic wiekszego.
Calosc zajmuje 170 (sto siedemdziesiat) MB na dysku, ale:
 * nie trzeba instalowac calosci a tylko np. 16/32/bit dos
 * nie trzeba prawie nic instalowac i ciagnac pliki pomocy (help)
   z czytnika CD. wystarczy wtedy 10-20 MB

---------------------------------------------------------------------------

>>>  Jak z przenosnoscia tego, co wygeneruje Watcom C/C++?

Kod 100 ANSI C compliant przejdzie wszedzie.

---------------------------------------------------------------------------

>>>  Czy w Microsoft C++ sa wzorce?

Wersja 1.0 jest ich pozbawiona, a w 1.5 sa, ale robione jako
makrodefinicje.

---------------------------------------------------------------------------

>>>  GNU C++

To nieprawda, ze:
1. Jest duzy - wersja minimalna zajmuje 13 MB, wersja pelna okolo 80MB.
   Ktory z komercyjnych kompilatorow jest mniejszy?
2. Jest wolny - owszem, wolno kompiluje, ale kod robi szybszy niz
   Borland.
3. Jest dostepny tylko w Stanach - oczywiscie djgpp mozna sciagnac z
   ftp.cyf-kr.edu.pl
4. Nie mozna nim robic rzeczy komercyjnych - licencja nie pozwala na to.

---------------------------------------------------------------------------

>>>  Jakie sa wymagania DJGPP?

Wymagania sprzetowe: 386DX lub lepiej (moze chyba byc SX), pozadane (ale
nie konieczne!) kilka (>4) MB RAM (wersja 1.12 ma blad, ktory powoduje
straszliwe spowolnienie pracy w 4 MB RAM, ale juz jest sposob, jak to
obejsc i nawet chyba jakis patch), 20+ MB dysku (pelna dystrybucja wraz z
zrodlami to jak sie zdaje ok. 300 MB).

---------------------------------------------------------------------------

>>>  Jak wyglada sprawa z szybkoscia DJGPP?

To o powolnej pracy to bujda oparta na niedokladnych danych. DJGPP pracuje
prawie calkowicie w trybie chronionym, ale jednak pod stara poczciwa
proteza systemu operacyjnego pod tytulem DOS. Musi wiec korzystac z
przerwan (w trybie rzeczywistym) zeby zrobic rzecz tak glupia jak czytanie
plikow z dysku. Wystarczy...

    while(!eof(plik)
      fgetc(plik);

zeby program pracowal diabelnie powoli (porownujac do innych kompilatorow).

---------------------------------------------------------------------------

>>>  Czy stosowanie zaprzyjazniania klas nalezy do dobrej praktyki
     programisty?

Nie, gdyz dopuszcza do latwego dostepu do pol prywatnych i
chronionych. Narusza to zasade "jedyna aktywnosc systemu
obiektowego to przekazywanie wiadomosci (message passing)". Istnieje
roznica miedzy zapisaniem "kolo->radius=5;", a "kolo->setRadius(5);".

---------------------------------------------------------------------------

>>>  Jak powinienem zabrac sie za programowanie obiektowe?

  Programowanie w C++ powinno przebiegac mniej wiecej wg schematu:
1. zidentyfikowanie obiektow,
2. opisanie powiazan miedzy obiektami,
3. deklaracja metod,
4. definicja metod.

---------------------------------------------------------------------------

>>>  Czy OOP oznacza brak optymalizacji?

Ani tak, ani nie - zaden jezyk z gory nie zaklada braku optymalizacji. To
zalezy tylko i wylacznie od konkretnego programu.

---------------------------------------------------------------------------

>>>  Czy latwiej jest dowiesc poprawnosci algorytmu w C, czy C++?

Ogolnie dowodzenie poprawnosci jest sprawa bardzo skomplikowana i zazwyczaj
lepiej jest uruchomic program niz przeprowadzac dowody. Niemniej jednak
samo testowanie programu jest latwiejsze w C++. Jesli zaprojektujesz system,
to mozesz miec co najwyzej bledy implementacji. W technologii obiektowej na
poziomie kodu nie powinienes miec bledow. Potega metod obiektowych tkwi
miedzy innymi w tym, ze sa testowalne w kazdej fazie.

---------------------------------------------------------------------------

>>>  Czy w OOP istnieje pojecie algorytmu?

Owszem, algorytm, czyli "sposob postepowania" wystepuje przy rozwiazywaniu
kazdego zadania majac do dyspozycji srednio inteligentnego studenta.

---------------------------------------------------------------------------

>>>  Czy Windows'95 (Chicago) jest systemem obiektowym?

Nie - dopiero Cairo ma takim byc.
Najpelniejszym systemem obiektowym jest NeXTStep - technologia, ktora
wyprzedza o pare lat to co istnieje teraz. Niestety, nie widzialem NS, wiec
nie moge powiedziec, na czym konkretnie to polega. Moge sie tylko domyslac,
ze np. kazdy plik jest obiektem. Tzn. przeciagniecie go na ikone drukarki
oznacza drukowanie, na ikona edytora jego edycje, etc.

---------------------------------------------------------------------------

>>>  Gdzie mozna dostac gramatyke C++ (obojetnie dla jakiego narzedzia,
     preferowane yacc(bison), lex(flex) itp), ale koniecznie AT&T 2.0
     (glownie chodzi o nested classes oraz templates)?

Wydaje mi sie, ze gramatyke (i leksyke) mozna wyciagnac z ostatniej wersji
GNU cc, ale wiem ze takowa jest dostepna publicznie na jakims ftp serverze.

---------------------------------------------------------------------------

>>>  Czy przejscie do OOP wymaga odrzucenia "balastu proceduralnego"?

Wczytujac sie w Stroustrupa "Jezyk C++" mozna zauwazyc jego
slowa: nowe techniki programowania nie neguja starych - uzupelniaja je.
To nie rewolucja. Tam gdzie wystarcza procedury lub moduly, nie szukamy
obiektow. Dopoki nie poslyszalem (przeczytalem) tego sadu
u Autora C++, tez przypuszczalem, ze "wejscie na droge obiektowa"
wymaga stanowczego odrzucenia tego, co sie juz umialo (i czulo).
Stroustrup ma doswiadczenie, odwage i prawo powiedziec - ze nie.

---------------------------------------------------------------------------

>>>  Co to jest konstruktor kopiujacy?

Konstruktor kopiujacy jest bardzo podobny do operatora przypisania,
tyle ze o ile operator przypisania uzywany jest dla obiektow juz
istniejacych, to konstruktor kopiujacy gdy tworzymy nowy obiekt i
jednoczesnie nadajemy mu jakas wartosc. Przyklad (bo bez przykladu
raczej malo kto zrozumie :-) ):

class A
{
 private:
   int data;

 public:
  A(int new_data=0)    : data(new_data) {};  // To jest zwykly
                                             // konstruktor

  A( A& a ) : data(a.data) {};     // A to konstruktor kopiujacy

  A& operator=(A &a) { data=a.data; return *this; } // a to
                                                    // operator przypisania
};

I teraz...

main()
{
 A a(1);       // Tu zostanie wywolany zwykly konstruktor, z argumentem 1
 A b;          // Podbnie, tyle ze argument zostanie domyslnie
               // przyjety jako 0
 A c=b;        // Tutaj konstruktor kopiujacy z argumentem b
 A d;          // A tutaj operator przypisania z tym samym argumentem
 d=b;
};

Najwazniejsze w tym wszystkim sa ostatnie trzy linijki, bo tutaj
wlasnie widac roznice, kiedy wywolywany jest operator przypisania, a
kiedy konstruktor kopiujacy. Konstruktor kopiujacy jest tylko i
wylacznie wtedy gdy przypisanie nastepuje rownoczesnie z utworzeniem.

Dlaczego to wyroznienie? Pozwala to zaoszczedzic operacji, bo
oczywiscie moglo by byc i tak ze kazda instrukcja typu "A b=c;"
bylaby rozbijana na dwie: "A b; b=c;". Ale wtedy niepotrzebnie obiekt
"b" bylby dwa razy inicjowany (w naszym przypadku najpierw "data=0",
a potem "data=c.data").

Taka instrukcja jak "A b=c;" jest rownowazna po prostu "A b(c);" a
nie (jak mogloby sie wydawac) parze instrukcji "A b; b=c;".

Ponizsze przyklady takze sa ciekawe:

class klasaA {
  public:
  klasaA metoda() { return (*this); };
  ...
};

Tutaj zostanie najpierw wykonana kopia obiektu (poprzez wywolanie
kostruktora kopiujacego) i kopia zostanie zwrocona jako wynik metody;
Trzeba bardzo uwazac na brak znaczku referencji "&"!!!

class klasaA {
  public:
  klasaA& metoda()
  {
    klasaA temp;
    ....
    return temp;
  };
  ....
};

Poniewaz "temp" jest obiektem o czasie zycia tylko wewnatrz metody, wiec by
moc zwrocic referencje do niego trzeba miec kopie o zasiegu wiekszym.
Kopilator wiec wola konstruktor kopiujacy z argumentem "temp" i tworzy jego
kopie na stercie i zwraca referencje do nowego obiektu.

---------------------------------------------------------------------------

>>>  Czy istnieje domyslny konstruktor kopiujacy?

Tak - kopiuje poszczegolne pola. Z tego powodu nie nadaje sie
do klas zawierajacych wskazniki - w efekcie otrzymujemy dwa obiekty
wskazujace na ten sam (trzeci) obiekt. Jezeli teraz jeden z tych
obiektow zostanie usuniety, to najprawdopodobniej zostanie tez
zniszczony obiekt przez niego wskazywany, i drugi z obiektow bedzie
wskazywal cos blednego. Dlatego tez gdy uzywamy operacji przypisania,
a dana klasa zawiera wskazniki, to trzeba konstruktor kopiujacy
zdefiniowac samemu, umieszczajac w nim operacje potrzebne do
utworzenia kopii obiektu wskazywanego przez wskaznik.

---------------------------------------------------------------------------

>>>  Jak rozpoznawac, czy dany program jest dobry; a nawet wiecej - czy
     dany projekt jest dobry?

Mozliwe kryteria:

o  dziala - dobrze, nie dziala - zle
o  stopien realizacji obiektow jako "czarnych skrzynek"
o  zbyt mala lub zbyt duza wiedza klas
o  czytelnosc
o  podatnosc na zmiany
o  poziom klasy w hierarchii dziedziczenia
o  powiazania miedzy modulami
o  mozliwosc powtornego uzycia

---------------------------------------------------------------------------

>>>  Gdzie mozna znalezc skrypty do pisania w C/C++ dla Emacsa?

Skrypty sa dostepne pod Linuxa (wersja Slackware, dostepna np. na galaxy).

---------------------------------------------------------------------------

>>>  Czy istnieja pakiety Smalltalk dla PC rozprowadzane jako shareware,
     freeware lub PD na cele dydaktyczne?

Jezeli chodzi o Linuxa, to najlepiej zajrzec pod URL:
  http://www.informatik.uni-stuttgart.de/stx/doc/online/english/TOP.html
Istnieje implementacja Smalltalka z gotowymi klasami do GUI na X11.

---------------------------------------------------------------------------

>>>  Jak uniknac dolaczania metod wirtualnych, z ktorych nie korzystam, a
     sa zadeklaroawne w definicji objektu?

Pozne laczenie ("late binding"), ktore UMOZLIWIA tworzenie metod
wirtualnych, polega wlasnie na tym, ze program w momencie kompilacji
i linkowania _nie wie_, ktore metody beda mu potrzebne. Inna sprawa ze
zwyklymi metodami.

---------------------------------------------------------------------------

>>>  Poszukuje informacji na temat rozszerzen do jezykow obiektowych (C++,
     Smalltalk, Eiffel), takich jak np. O++ do C++. (O++ jest rozszerzeniem
     C++ pozwalajacym na tworzenie obiektow trwalych (persistent),
     manipulowanie nimi, laczenie w clustery etc.).

Jesli chodzi o Smalltalk, to jego rozszerzeniem jesli silnie stypizowany
Strongtalk.

---------------------------------------------------------------------------

>>>  Lepiej trzymac procedury usystematyzowane pod katem otoczenia, a wiec
     procedury dostepu do sprzetu osobno, grafike osobno, algorytmy osobno,
     itd. Rozrzucanie metod po klasach niezbyt mi pasuje.

Dlatego masz tzw. interface classes, jak chocby "Okno" czy standardowy
"ifstream".
Klasa NIE JEST workiem, do ktorego sie wrzuca spokrewnione funkcje, choc
tak niektorzy ja pojmuja. Klasa NIC NIE ROBI - klasa JEST CZYMS. I posiada
operacje, ktore pozwalaja cos z tym czyms robic.

=================================== IV ====================================

>>>  Czy ktos posiada doswiadczenie na temat zestawu SmallTalk+DOS -
     - uruchomienie?

---------------------------------------------------------------------------

>>>  Czy istnieje shareware'owa wersja programu do graficznego
     projektowania klas - Together/C++?

---------------------------------------------------------------------------

>>>  Mam dwie klasy; przy deklaracji kazda z nich potrzebuje deklaracji tej
     drugiej? Czy ktos wie jak rozwiazac _elegancko_ ten problem?

---------------------------------------------------------------------------

>>>  Jak ominac blad w konkretyzowaniu klasy struktura zagniezdzona?

Przyklad blednie napisanego programu...

template <class Typ>
class Wzor
{ // tu rozne rzeczy - istnieja odwolania do "Typu"
};

class Potomek : public Wzor<struct T>
{ // cos tam
  struct T
  { //  pola nie sa wazne
  };
};

---------------------------------------------------------------------------

>>>  Czy jest w Warszawie jakas biblioteka z "The C++ report"?

---------------------------------------------------------------------------

>>>  Jak mozna najprosciej zrealizowac hash table przechowujaca dowolne
     obiekty rozne od siebie (tzn. obj1 != obj2 ), a wlasciwie to nawet
     jedynie wskazniki do nich (32 bitowe). Nalezy napisac taki wzorzec:

template <class T>
class HashTable
{
  public:
  HashTable();
  ~HashTable();

  void insert(T*);      // insert ONLY unique objects
  bool remove(T*);      // returns: removed or not

  bool contains(T*);
};

oraz oczywiscie iterator
template <class T>
class HashTableIterator... // itd.

---------------------------------------------------------------------------

>>>  Co to sa jezyki 4 generacji i na czym polega roznica miedzy nimi
     a innymi jezykami?

---------------------------------------------------------------------------

>>>  Jak zapakowac obiekt (BP 7.0) do DLL-a? Obiekt zawiera metody wirtualne
     i DLL powinien go udostepniac.

---------------------------------------------------------------------------

W programie wystepuje dokladnie jeden obiekt klasy GlobalClass, ktory
powinien udostepniac swoje metody innym obiektom, ktore z kolei nie
posiadaja zadnych referencji do niego. Widze dwa mozliwe rozwiazania:

1. Zdefiniowac wszystkie zmienne i metody klasy jako statyczne, nie
definiowac konstruktora. Wada: trudno kontrolowac zakres widzialnosci
skladowych GlobalClass.

2. Zdefiniowac klase normalnie, oraz zadeklarowac wskaznik na ta
klase tam gdzie potrzeba. W ten sposob mozna ograniczyc zakres
widzialnosci klasy, ale moze powstac wiecej obiektow danej klasy,
co jest nielegalne.

>>>  Any ideas?

---------------------------------------------------------------------------
################################################### FAQ pl.comp.objects ###

-- 
------------------------ Maciej "MACiAS" Pilichowski -------------------------
                              Chodkiewicza 12b/5
                             87-100 Torun, Poland
                           tel. (+48) (0-56) 334-34
====================== email: macias@vm.cc.uni.torun.pl ======================
Technical Details
Message-ID: <pl-comp-objects-faq-1-879613802@ict.pwr.wroc.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!ict.pwr.wroc.pl!ict.pwr.wroc.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!ict.pwr.wroc.pl!ict.pwr.wroc.pl!not-for-mail
From: macias@vm.cc.uni.torun.pl (Maciej Pilichowski)
Newsgroups: pl.comp.objects,pl.answers
Subject: pl.comp.objects FAQ (Frequently Asked Questions and more)
Supersedes: <pl-comp-objects-faq-1-876931803@ict.pwr.wroc.pl>
Followup-To: pl.comp.objects
Date: 15 Nov 1997 17:10:03 -0000
Organization: Lista dyskusyjna objects@sprocket.ict.pwr.wroc.pl
Lines: 823
Sender: tsurmacz@okapi.ict.pwr.wroc.pl
Approved: tsurmacz@okapi.usenet.pl
Distribution: world
Message-ID: <pl-comp-objects-faq-1-879613802@ict.pwr.wroc.pl>
Reply-To: macias@vm.cc.uni.torun.pl (Maciej 'MACiAS' Pilichowski)
NNTP-Posting-Host: okapi.ict.pwr.wroc.pl
Keywords: programowanie obiektowe obiekty c cpp cplusplus stroustroup watcom borland gcc djgpp smalltalk kompilator funkcja klasa konstruktor operator
X-Archive: ftp://ftp.ict.pwr.wroc.pl/pub/faq-pl/pl-comp-objects-faq.1
X-Posting-Frequency: 30 days
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit