piotreks

Reputacja

1,365

Głosów ogółem

użytkownik głosował za tyle razy
52
Użytkownik głosował przeciw tyle razy
1
  • Roczniak
  • Zdyscyplinowany
  • Wsparcie
  • Student
  • Redaktor
Prawdziwe imię
Piotrek
Członek od
2 lata, 4 miesiące
Ostatnio widziany
1 rok, 4 miesiące temu
Wiek
24

O mnie

Practice makes Perfect

Odpowiedzi: 61

  • 2010-01-30 22:35:54 Czy przeładowaniu AJAXem można zmienić URL przeglądarki? [zamknięte]

    Możesz dodawać do adresu kotwice (#) np.

    strona.html#Strona_glowna
    

    I na tej podstawie rozpoznawać wybrany dział.

  • 2010-02-05 12:44:08 Wywołanie statycznej metody w PHP

    Wewnątrz klasy możesz korzystać zarówno z odwołania poprzez słowo kluczowe self jak i poprzez nazwę kwalifikowaną, z użyciem nazwy klasy. Np:

    <?php
        class A {
            public static function Statyczna() {
                echo 'Statyczna';
            }
            public function Zwykla() {
               self::Statyczna();
               A::Statyczna(); // równoważny zapis
            }
        }
    ?>
    

    Na zewnątrz wywołanie statycznej metody możliwe jest zarówno przy użyciu instancji obiektu, jak i samej klasy:

    <?php
       $a = new A;
       $a->Statyczna();
       A::Statyczna(); // to samo co wyżej
    ?>
    

    W przypadku dziedziczenia, chcąc wywołać metodę statyczną z klasy bazowej, można użyć zamiast słowa self, słowo parent ( w sytuacji kiedy zasłoniliśmy metodę statyczną w klasie pochodnej - zamiana taka nie jest konieczna, ponieważ metody statyczne są dziedziczone ).

    W PHP wersji 5.3 wprowadzona została nowa funkcjonalność - późne wiązanie metod statycznych. Wprowadzono nowe zastosowanie słowa kluczowego static. Późne wiązanie umożliwia tworzenie wirtualnych metod statycznych.

    class A {
        public static function Statyczna() {
            echo 'Statyczna A';
        }     
        public static function PozneWiazanie() {
            static::Statyczna(); // odwołanie poprzez static, a nie self
        }
        public static function WczesneWiazanie() {
            self::Statyczna(); // zawsze wywoła metodę z tej klasy
        }
    }
    
    class B extends A {
        public static function Statyczna() {
            echo 'Statyczna B';
        }
    }
    
    B::WczesneWiazanie(); // metoda "Statyczna()" z klasy A
    B::PozneWiazanie(); // metoda "Statyczna()" z klasy B
    

    Obydwie metody: WczesneWiazanie() i PozneWiazanie() zostały odziedziczone w klasie B z klasy A. Pierwsze wywołanie B::WczesneWiazanie() powoduje wywołanie metody z klasy A, pomimo tego, że została ona przesłonięta w klasie pochodnej. Wynika to z wczesnego wiązania, które jest domyślne w przypadku użycia słowa self. Natomiast drugie wywołanie działa już poprawnie w tym sensie, że odwołanie, które następuje wewnątrz odziedziczonej metody z klasy A, jest poprawnie przekierowywane do statycznej metody klasy B (jej nowej definicji).

  • 2010-02-07 23:15:53 STL vector - wyszukiwanie metoda bisekcji

    #include <vector>
    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    template<class T>
    bool less_than(const T& t1, const T& t2) {
        return t1 < t2;
    }
    
    template<class T, class Cmp>
    int bisekcja(const vector<T>& v, const T& s, const Cmp& cmp = Cmp()) {
        int a = 0;
        int b = v.size() - 1;
        int c;
        while(a <= b) {
            c = (a + b)/2;
            if(!cmp(v[c], s) && !cmp(s, v[c])) {
                return c;
            } else {
                if(cmp(s, v[c]))
                    b = c - 1;
                else
                    a = c + 1;
            }
        }
        return -1;
    }
    
    int main() {
        int liczby[] = { 1, 4, 7, 12, 15, 37, 75, 90, 102 };
    
        vector<int> Tablica(liczby, liczby + sizeof(liczby) / sizeof(*liczby));
    
        cout << bisekcja(Tablica, 7, ptr_fun(less_than<int>)) << endl;
    
        return 0;   
    }
    

    `

  • 2010-02-07 10:29:11 Dynamiczna rozbudowa klasy w php5

    Rozwiązanie przedstawione przez halish'a ma dwie podstawowe wady:

    1.Magiczna metoda __call otrzymuje argumenty jako tablicę, i właśnie tablicę przekazuje do domknięcia o nazwie $method. W tej sytuacji nie możemy zdefiniować domknięcia wieloargumentowego:

    $foo->bar = function($a, $b, $c) { return $a+$b+$c; };
    

    a jedynie:

    $foo->bar = function($a) { return $a[0]+$a[1]+$a[2]; };
    

    Dlatego lepszym rozwiązaniem, byłoby przedefiniowanie metody magicznej w następujący sposób:

    class Foo { 
        public function __call($method, $args) { 
            if (isset($this->$method) === true) { 
                call_user_func_array($this->$method, $args);
            } 
        } 
    }
    

    call_user_func_array wywołuje funkcję (nie metodę, domknięcie w tym przypadku jest funkcją przypisaną polu klasy!) konwertując tablicę na kolejne argumenty.

    2.W sytuacji gdy nie możemy modyfikować definicji klasy (a co za tym idzie - dodać metodę magiczną __call), można skorzystać z faktu, że domknięcia (Closures) to w rzeczywistości zwykłe klasy. Zapis:

    $closure = function($a, $b) { return $a+$b; };
    

    jest wewnętrznie zamieniany na klasę z metodą magiczną __invoke:

    class closure {
        public function __invoke($a, $b) {
            return $a + $b;
        }
    }
    

    Ponieważ metoda ta jest publiczna, możemy ją wywoływać na rzecz zmiennej przechowującej domknięcie:

    $closure = function($a, $b) { return $a+$b; };
    $closure(1, 2);
    $closure->__invoke(1, 2); // poprawne, to samo co wyżej, ale jawne wywołanie metody magicznej
    

    Dlatego każdą klasę, która nie zablokuje dodawania nowych pól poprzez przedefiniowanie metody magicznej __set (przechwytującej przypisania do nieistniejących pól), możemy rozszerzyć o nowe funkcje (piszę funkcje, ponieważ nie są to metody, nie mają wskaźnika $this):

    class Foo {}
    
    $foo = new Foo;
    $foo->bar = function($a) { echo $a; };
    $foo->bar->__invoke(1);
    

    Jak widać, nie było potrzeby modyfikowania klasy Foo. Ale niestety nadal są to tylko funkcje, a nie metody posiadające dostęp do pól prywatnych i chronionych klasy.

  • 2010-01-31 19:23:06 Pozycjonowanie elementów. [zamknięte]

    @DarthHass: niedokładnie tak jak mówisz, nie tylko przeglądarka.

    Absolute - pozycjonowanie absolutne, ale względem elementu nadrzędnego, którego pozycjonowanie jest inne niż static.

    Relative - pozycjonowanie względem normalnego położenia, takiego jakie miałoby gdyby było static.

  • 2010-02-03 12:44:58 Możliwości C++

    Jeśli chodzi o język C++ to jego największą zaletą jest to, że stwarza on nieograniczone możliwości, w przeciwieństwie do innych języków, których składnia czasami wręcz na siłę uszczęśliwia programistę zmyślnymi kombinacjami. W C++ napiszesz prawie wszystko. Dodatkowo zaawansowana znajomość tego języka umożliwia programiście tworzenie niesamowicie elastycznych rozwiązań - głównie mam na myśli umiejętne wykorzystanie szablonów w metaprogramowaniu.

    Pokaz takich możliwości został zebrany w bibliotece boost - niesamowite rozszerzenie funkcjonalności języka C++, zwiększa intuicyjność i czytelność programów, oraz łatwość i szybkość ich tworzenia

    W dziedzinie tworzenia GUI (graficznych interfejsów użytkownika) godnym polecenia jest Qt - umożliwia nie tylko tworzenie interfejsów graficznych, ale dostarcza niezależnych od platformy adapterów dla wątków, połączeń tcp, udp i wiele innych.

    Do tworzenia gier na początek myślę przede wszystkim OpenGL, chociaż do tego wystarczy samo C.

  • 2010-02-07 11:29:54 [c++]środowisko programistyczne

    Microsoft Visual C++ 2008 Express Edition - darmowe, bez ograniczeń do zastosowań komercyjnych, wygodne, mechanizm IntelliSense.

    Netbeans z wtyczką (pluginem) do C++ i dowolnym kompilatorem (np. cygwin, mingw, pod Linuksem gcc, g++).

  • 2010-03-03 17:17:26 Funkcja w funkcji. [zamknięte]

    Funkcje możesz tworzyć w dowolnym miejscu.

    Jeżeli chcesz odwołać się do funkcji zdefiniowanej w innej funkcji:

    var funkcja = function() {
       this.subfunkcja = function() {
           alert('Wewnętrzna');
       }
    }
    
    new funkcja().subfunkcja();
    

  • 2010-01-31 11:38:34 słowo kluczowe this

    Rozszerzając wypowiedź tomaszs'a

    Oddelegowanie konstruktora

    Nasz konstruktor, przed wykonaniem swoich operacji, może wywołać inny konstruktor tej samej klasy.

    public class A {
        public A(int i) {
            System.Console.Write("Najpierw ja " + i);
        }
        public A(char c) : this(5) { // wywoła najpierw operacje jak przy tworzeniu new A(5)
            System.Console.Write("Potem ja " + c);
        }
    }
    

    Zwracanie wartości this

    Zwrócenie wartości this umożliwia łańcuchowe przeprowadzenie operacji na tej samej instancji obiektu:

    public class A {
        public A Oblicz() {
             // obliczenia
             return this;
        }
        public A Wynik() {
             // wyświetlanie wyniku
             return this;
        }
    }
    
    A a = new A();
    a.Oblicz().Wynik(); // dwie operacje na tej samej instancji
    

  • 2010-01-31 17:06:54 Dobre i darmowe IDE do C# [zamknięte]

    Alternatywa dla Visual Studio - pytanie

Tagi: 0