Wiem, że wdrażanie obiektów podobnych do nieruchomości było wielokrotnie dyskutowane, ale to, czego potrzebuję, różni się nieco od różnych proponowanych rozwiązań.Zmienna właściwości w języku C++
Co chcę jest obiektem, który ma te same semantykę zmiennej, ale gdy jej wartość jest zmieniana Chcę wykonać pewne działania. Oznacza to posiadanie niejawnych metod pobierania/ustawiania, zaimplementowanych przeciążanie operatora = i niejawnego operatora konwersji.
Należy pamiętać, że kiedy mam na myśli "właściwość podobną", nie mam na myśli semantycznego object.property
, ale tylko sposób na uzyskanie niejawnych metod pobierania/ustawiania (jak w property-like-variable = value
). Powodem jest to, że mam jakiś istniejący kod, który używa zmiennej, chcę wykonać jakąś akcję za każdym razem, gdy zmienia się wartość zmiennej bez zmiany istniejącego kodu (tylko deklaracja zmiennej powinna się zmienić).
I uzyskali ten wynik z minimalnym kodu:
#include <stdio.h>
class Int
{
int _value;
public:
// default constructor
Int() { printf("Int: initial value undefined\n"); }
// assignment constructor
Int(int value) : _value(value) { printf("Int: initial value is %d\n", _value); }
// property get
operator const int() const { return _value; }
// property set
int operator=(int value)
{
_value = value;
printf("new value is %d\n", value);
return value;
}
// TODO: overload other operators if needed
};
To jest przykład użycia:
class C
{
Int _i;
public:
C() : _i(2) { }
void foo()
{
_i = 3;
printf("foo(): _i = %d\n", _i);
}
};
int main()
{
int i;
Int I;
i = 1;
I = i;
I = I + 1;
C c;
c.foo();
}
Teraz kilka pytań:
- ma tę potrzebę już omówione? Jest wzór projektu?
- Robię coś złego tutaj? (zarówno z punktu widzenia implementacji, jak i projektowania).
- W tym przypadku istnieje pewna wada wydajności lub kompilator jest w stanie zoptymalizować go bez obciążania?
- Istnieje lepszy sposób na wywoływanie tego konstruktu? Ponieważ nie wydaje się to ściśle "własnością" (wydaje się bardziej podobne do "boksowania" zmienną w klasie).
- Czy można to uogólnić szablonami? Nie widzę prostego sposobu, aby to zrobić, ponieważ potrzeba zrobienia tego jest wykonywanie niestandardowych rzeczy podczas pobierania/ustawiania wartości.
Nazwałbym to po prostu „klasy otoki” otoczyć 'int' w nieco innym API, ale może jest na to lepsze słowo. – hyde
Niedawno użyłem podobnego wzorca ... Jednak okazało się, że jest to problematyczne w połączeniu z 'auto' C++ 11, ponieważ operator konwersji nie zostanie w tym przypadku wywołany, a skopiowanie klasy opakowania może być niepożądane. – Julian