2014-04-22 6 views
9

Studiuję projekt open source ROS. Podczas gdy widziałem dziwny kod.przekazywanie przydzielonego wskaźnika przed przydzieleniem

Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false); 

Zmienna serwer służy zanim zostanie przydzielona jako serwerze. Czy to jest możliwe? Przynajmniej mój kompilator Visual Studio 2010 nie rozumie tego stylu kodu. Daj mi znać, czy to naprawdę możliwe, czy nie.

oryginalny dokument z kodem: http://wiki.ros.org/actionlib#C.2B-.2B-_SimpleActionServer


--------- Dodano

Dziękuję za życzliwość. Jednak mam "" serwer ": niezadeklarowany identyfikator" błąd podczas kompilacji go. więc przetestowałem prosty kod.

class TestCls { 
public: 
    TestCls(TestCls *aa) 
    { 

    } 
}; 

int main(int argc, char **argv) 
{ 
    TestCls tt(&tt); 

} 

Powoduje również ten sam błąd. "tt": niezadeklarowany identyfikator ". Czy czegoś brakuje? proszę pomóż mi.

+4

To wygląda jak błąd w kompilatorze. Powinien się skompilować. [Przykład G ++] (http://coliru.stacked-crooked.com/a/b5dc8e8ff6b70059), [Przykład Clang ++] (http://coliru.stacked-crooked.com/a/e238b2e6abc2f93b). – Mankarse

+0

w porządku. wygląda na to, że MS Visual Studio 2010 nie może tego skompilować. dziękuję Mankarse. dziękuję Bill Gates. –

Odpowiedz

12

To jest legalne. Zmienne są w zasięgu natychmiast po zadeklarowaniu. Ta zasada ma na celu umożliwienie zbudowania samoodbiorczych struktur danych w jednej linii. Wskaźnik może wskazywać na nie skonstruowany obiekt, o ile nie zostanie z niego dereferencji przed skonstruowaniem tego obiektu.

Ponieważ wskaźnik jest przekazywany do konstruktora Server, będzie działał tak długo, jak Server poprawnie czeka przed wywołaniem obiektu funkcji.

+0

Dziękuję Mankarse. Dodałem kolejne pytanie. proszę pomóż mi –

Powiązane problemy