Autor Wątek: dziedziczenie  (Przeczytany 4972 razy)

Offline lux

  • Użytkownik
    • homepage

# Sierpień 03, 2006, 12:07:43
Witam!

Goto też ostatecznie czasem się przydaje... Mnie na przykład zastępuje nieobecne w C++ a obecne np. w PHP polecenie break 2, które pozwala wyskoczyć z dwóch pętli na raz (co zdarza się bardzo często, np. dla for x > for y).

for (int x = 0; x < max_x; ++x) {
  for (int y = 0; y < max_y; ++y) {
    if (koniec[x][y]) {
      x = max_x;
      y = max_y;
    }
  }
}

Pozdrawiam,
lux

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Sierpień 04, 2006, 04:50:21
lux: Nawet jeśli kompilator zrobi z tego coś nie mniej wydajnego (w co wątpię, raczej to będzie mnie wydajne), to jest dużo mniej czytelne i eleganckie niż goto.

Offline nameczanin

  • Użytkownik
    • devlog

# Sierpień 04, 2006, 04:55:47
ale jednak intuicyjne :P

Offline Xion

  • Moderator
    • xion.log

# Sierpień 04, 2006, 13:30:12
Cytuj
Wielokrotne dziedziczenie owszem, zwykle jest niepotrzebne tudzież szkodliwe, ale w C++ głównie zajmuje miejsce nieobecnego mechanizmu implementowania przez klasę interfejsów (jak wiemy z C# i innych nowocześniejszych języków, jest coś takiego jak interfejs i klasa może implementować ich wiele).
Ależ w C++ mechanizm implementowania przez klasę interfejsów jest obecny - właśnie poprzez wielokrotne dziedziczenie. Jeżeli klasa bazowa zawiera wyłącznie czysto wirtualne metody, to pełni ona właśnie funkcję interfejsu. Jedyna różnicą jest zapewne właśnie to, że inaczej niż w Javie/C#/Delphi nie ma tu ani osobnego sposobu definiowania bazowych interfejsów (vide słówko interface zamiast class), ani ich dziedziczenia (implements z Javy).

Offline TeMPOraL

  • Użytkownik
    • devBlog

# Sierpień 05, 2006, 22:55:53
Apropo tej pętli. Rozwiązanie w tym konkretnym przypadku ujdzie, ale jeśli zmienne x i y byłyby zadeklarowane przed pętlą i po pętli potrzebowalibyśmy ich prawidłowej zawartości (co też się stosunkowo często zdarza) to już tak gładko nie przejdzie ;)

Offline SauRooN

  • Użytkownik

# Sierpień 06, 2006, 00:47:51
Jedyna różnicą jest zapewne właśnie to, że inaczej niż w Javie/C#/Delphi nie ma tu ani osobnego sposobu definiowania bazowych interfejsów (vide słówko interface zamiast class)
Jeżeli używasz Visual C++ 8.0, to możesz już spokojnie używać słów kluczowych __interface i __abstract. Będą już w standardzie C++0x.

Offline lux

  • Użytkownik
    • homepage

# Sierpień 06, 2006, 01:14:16
Witam!

Apropo tej pętli. Rozwiązanie w tym konkretnym przypadku ujdzie, ale jeśli zmienne x i y byłyby zadeklarowane przed pętlą i po pętli potrzebowalibyśmy ich prawidłowej zawartości (co też się stosunkowo często zdarza) to już tak gładko nie przejdzie ;)

Jak ktoś jest naprawdę zawzięty i nie chce używać goto to również w tym przypadku można sobie poradzić:
int x = 0;
int y = 0;
for (; x < max_x; ++x) {
  for (; y < max_y; ++y) {
    if (koniec[x][y]) {
      max_x = -max_x;
      max_y = -max_y;
      // Najprawdopodobniej potrzebne będą właśnie takie wartości :)
      --x;
      --y;
    }
  }
}

Albo jeszcze śmieszniej (jeśli nie potrzeba całego zakresu zmiennej, bo tak też z reguły bywa):
const int INF = 1<<30;
for (; x < max_x; ++x) {
  for (; y < max_y; ++y) {
    if (koniec[x][y]) {
      (--x) |= INF;
      (--y) |= INF;
    }
  }
}
x -= x & INF;
y -= y & INF;

Oczywiście zastosowanie tego praktycznie jest raczej wątpliwe.

Pozdrawiam,
lux
« Ostatnia zmiana: Sierpień 06, 2006, 01:16:02 wysłana przez lux »

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Sierpień 06, 2006, 09:23:23
Rzeczywiście śmiesznie. A programiści nie lubią, gdy ich dzieła są śmieszne :). Dlatego też owo "break 2" byłoby jednak najlepsze. Brakuje mi tego, a goto nie używam, gdyż wnerwiają mnie etykiety. Przydałoby się "break 2" wprowadzić do Standardu, a nie jakieś tam __interface'y i __abstract'y, które stanowią w sumie czysto kosmetyczne ulepszenie.

Offline nameczanin

  • Użytkownik
    • devlog

# Sierpień 06, 2006, 12:13:58
dla petli 'x' dac while(bool) a dla petli 'y' uzyc break; przy stopowaniu tego bool'a dajemy na false i break'ujemy. Tez wyjscie :ASd

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 06, 2006, 12:55:38
Ja tam w takich przypadkach czasem po prostu używam goto do etykiety tuż za pętlą. Pamiętajmy o tym, że zasada z nieużywaniem goto została wymyślona po to, żeby kod był czytelniejszy, ale w tym przypadku potrafi działać to zupełnie odwrotnie. :)

Offline Moriturius

  • Użytkownik

# Sierpień 06, 2006, 14:08:11
tak, ja tez jestem zagorzalym fanem goto jako substytut nieobecnego break 2 :)

Offline snakeo

  • Użytkownik

# Sierpień 07, 2006, 01:30:30
Aha, takie coś ma jeszcze jedną fajną nazwę - skierowany graf acykliczny :).
I wygląda tak:

Offline fofoo

  • Użytkownik
    • WebLog

# Sierpień 08, 2006, 11:20:14
Właśnie trafiłem na ciekawą strone (nawet bardzo ciekawą) o tematyce OOP
http://ootips.org/