Z C++ zagadka nr 4
Mając przedstawioną poniżej strukturę danych i kontener zawierający wskaźniki, wykonać operację/metodę methodA na rzecz obiektu obj_ posługując się iteratorem:
class Foo {
public:
methodA() {
printf("Wykonano...\n");
}
}
struct data_t {
int i_;
Foo* obj_;
}
std::list<data_t*> data_;
for(std::list<data_t*>::iterator i = data_.begin(); i != data_.end(); i++ ) {
// operacje
}
W jaki sposób wykonać blok operacji ? Możliwości mamy kilka:
/* 1 */ i->obj_->methodA(); /* 2 */ *i->obj_->methodA(); /* 3 */ (*i)->obj_->methodA();
Rozwiązanie zagadki jest proste, ale wymaga znajomości priorytetów operatorów. Pierwsze wywołania jest całkowicie błędne, ponieważ lista przecowuje wskaźniki do strkutury, a nie samą strukturę. Zatem należy najpier wyłuskać strukturę znajdującą się pod wskazywanym adresem i dopiero wtedy wykonać metodę. Okazuje się że rowiązania 2 również jest nie poprawne, właśnie ze względu na priorytety operatorów. Dopiero numer 3 daje zamierzony efekt. Na szczęście błąd ujawnia się na etapie kompilacji…
| Drukuj artykuł | Ten wpis został napisany przez pejotr na 25-07-2010 o 13:50, i jest w kategorii C++, Programowanie. Podążaj za odpowiedziami do tego wpisu przez RSS 2.0. Możesz napisać komentarz, lub trackbacka z Twojej własnej strony. |
