Implementacja właściwości (ISO C++)

0

Witam!

Mam pewien problem z zaimplementowaniem właściwości w ISO C++. Otóż sposób w który to zrobiłem działa dobrze dla typów wbudowanych, enumów i wskaźników na nie, jednak zupełnie się nie sprawdza w przypadku struktur i klas. Czy miałby ktoś jakiś pomyśl jak to rozwiąć?

Kod mojego rozwiązania :

template <typename Type, typename Class>
class __property
{
  private:
    __property(const __property<Type, Class>&); // not implemented
    __property<Type, Class>& operator=(const __property<Type, Class>&); // not implemented
    typedef void(Class::*Set)(Type);
    typedef Type(Class::*Get)();
    Set __set;
    Get __get;
    Class* __class;
  public:
    operator Type()
    {
      return (__class->*__get)();
    }
    __property<Type, Class>& operator=(Type val)
    {
      (__class->*__set)(val);
      return *this;
    }
    __property(Get getter, Set setter, Class* ClassPtr) : __set(setter), __get(getter), __class(ClassPtr) {}
};
0

1' zdefiniuj: "nie sprawdza sie"
2' nie jestes pierwsza osoba ktora sie za to brala, wszystkie zaczynaja od czegos w rodzaju powyzszego kodziku. zapoznaj sie z nimi na poczatek..

3' pomyslow na rozwiniecie tematu jest wiele i pochodza od poprzednikow, np:

  • twoje Property wazy minimum 5sizeof(wskaznik) (memberptr+memberptr+ptr), da sie osiagnac mniejsza wielkosc, jesli dobrze pamietam, rowna ~1 bajt. jesli zle pamietam - rowna 1sizeof(wskaznik)

  • sposob uzycia TYPE u Ciebie powoduje ze GET i SET sa zawsze lustrzane i jesli TYPE bedzie bez * ani & to Get bedzie pobieral parametr przez wartosc.. niezbyt mile

  • setter w postaci przeciazonego operatora = -- ok. ale co z getterem? dla struktur i klas nie uda Ci sie nigdy aby properties wspolpracowal z operatorem kropki i dawal dostep do pol wartosci. z operatorem -> juz sie da. nie masz tego, masz jedynie getter w postaci operatora konwersji.. kiepskie to property ktore trzeba wziaz rzutowac na jego wlasny typ:)

  • implemetacja wymaga aby w klasie uzywajacej tego property stworzyc pare metod: get i set i je podac przy inicjalizacji.. a to powoduje ze:
    ---- dla kazdego property trzeba podac dwie metody, nawet jesli sa trywialne. to wymusza implementacje 2N metod i pilnowanie ich.. brzydko
    ---- kazde property jest get/set. nie mozna zrobic property get-only ani set-onlym chyba ze dostarczysz takie implementacje recznie.. brzydko
    ---- kazde z racji jego parametrow konstrukcji wymaga, aby KAZDY konstruktor klasy ktora go uzywa explicite inicjalizowal KAZDE jedno property tej klasy. to wymusza dodanie N
    M wpisow w listach inicjalizacyjnych, ktorych tez trzeba pilnowac.. brzydko

0

2 : Hmm... Szukałem tego, tylko nie potrafiłem znaleźć. Mógłbyś zarzucić linkiem?

3 : Nie za bardzo rozumiem ;P Co miałbym zmienić (wiem, najprawdopodobniesz wszystko)??

0

Ano, dzięki, tylko jedyne co tam jest zlikwidowane to narzut. W sytuacji gdy potrzebuję czegoś co działa dla klas to się nie przyda...

0

moze tak odpowiedz na moje pytanie numer 1?

0

Ok.

Nie ma dostępu do składowych (ale do tego trzeba by było operator -> przeciążyć, tylko za ch...iny nie wiem jak to zrobić)...

0

aa no to to co myslalem.. masz BOOST'a ? podejrzyj implementacje scoped_ptr albo shared_ptr - tam to jest zrobione, mozliwe ze tez jest w standardowym auto_ptr. generalnie, wystarczy ze klasa bedzie dostarczac bezparametrowy T* operator->() const

zerknij np. na deklaracje klasy:
http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/scoped_ptr.htm

to pozwola uzywac skladni
scoped_ptr<obiekt> ptr = ...;
ptr->metoda()

przyczym metoda() wywola sie w kontekscie tego, co zwroci operator->, czyli wywola sie obiekt::metoda

0

No tak, tylko wtedy jak wykryć że ktoś coś zmienił w klasie/strukturze??

0

a po kiego?
nie da sie. klasa/struktura sama musi poinformowac wlasciciela ze sie zmienila

1 użytkowników online, w tym zalogowanych: 0, gości: 1