Mutujące zmienne

10.05.2009 15:27 in c++, devblog

Słowo kluczowe C++ na niedzielę: mutable. Działanie:

struct A
{
  mutable int a;
  void f(int v) { a = v; }
  int g() const { int _a = a; a += 2; return _a; }
};

Jaki jest pożytek z mutable? Możemy wywoływać funkcje const na obiekcie klasy i zmieniać jej wewnętrzne dane. Chory pomysł? Nie, jeżeli nasze zmienne mają charakter pomocniczy (np. służą do debugowania/profilowania) albo po prostu korzystamy z czyjegoś kodu.

W PhysX na przykład jest sobie klasa NxUserStream, która udostępnia operacje odczytu/zapisu do strumienia. Operacje odczytu są właśnie const. Implementacja z SDK korzysta z pliku (FILE*) i operacje odczytu są realizowane za pomocą fread. Oczywiście stan klasy się nie zmienia - ona posiada jedynie wskaźnik do uchwytu. Jednak chcąc zrealizować strumień korzystający z danych w pamięci potrzebne nam będzie na przykład pole określające bieżącą pozycję w strumieniu. I o tym, że jego zawartość może się zmieniać, projektanci PhysX już nie pomyśleli - ale na szczęście standard C++ tak. :)

Comments:

  1. Reg

    Reg:

    Moim zdaniem mutable przydaje się przede wszystkim do takich pól klasy, które mają działać jako lazy-evaluated, czyli są wyliczane przy pierwszym użyciu. Na przykład klasa DATETIME może pamiętać rok, miesiąc, dzień oraz dzień tygodnia, ale ten ostatni wylicza tylko przy pierwszym odczytywaniu. Trzeba, żeby dzień tygodnia dało się odczytać również z obiektu const DATETIME.

    10.05.2009 15:37:38

Leave comment: