2011-01-01 14 views
7

Piszę klasę kolekcji. Chcę przeciążać operator nawias kwadratowy ([]), aby zapewnić dostęp do elementów w kolekcji.Przeciążanie operatora nawiasów kwadratowych do wartości akceptowanej

int operator[](int i) 
{ 
    // Do stuff here 
} 

Moim problemem jest to, że nie widzę, jak napisać to tak, że mogę użyć tego operatora przyjąć wartość:

myClassInstance[0] = value; 

widzę żadnego sposobu deklarowania kwadratowy wsporniki z operatorem dodatkowy argument (wartość do przypisania do elementu).

Wiem, że mogę po prostu zwrócić int &, a dzwoniący może przypisać do tego wartość, ale wewnętrznie każdy element jest przechowywany w innym formacie niż ten opublikowany.

Czy to możliwe?

+0

potrzebne są dwa [] (int) wersje operatora. wersję const i wersję niestałą, o którą prosiłeś. Oryginalna wersja powinna mieć const za tym, aby wywołać obiekt const; –

+0

@Edwin: Widziałem twój drugi komentarz. Zrobię to. Dzięki. –

Odpowiedz

9

Napisz klasę int_proxy, która jest domyślnie wymienialna na int i jest przypisywana od int. Będziesz potrzebował co najmniej dwie funkcje składowe:

operator int(); 
int_proxy& operator=(int); 

w tej klasie proxy, przechowywać wszelkie informacje, których potrzebujesz, aby móc pobrać i ustawić wartość w pojemniku. Wykonaj pobieranie w operatorze konwersji i przypisanie w operatorze przypisania.

+1

Zapomniałeś wspomnieć, że oryginalny operator int [] (int) powinien mieć modyfikator const, który pozwala mu wywoływać obiekty const. –

+0

Myślałem, że mogę to zrobić prostszy niż to. Ale nie wygląda na to. Dzięki! –

+0

@Edwin: Czy istnieje sposób, aby uczynić go tak, aby można było odczytać obiekt 'const' za pomocą' [] ', a jednocześnie odczytać i zapisać obiekt nie będący const przy użyciu tego samego operatora? – supercat

2

Zwraca odwołanie do obiektu, który ma operator =, który może wypchać int, gdzie musi iść. Popatrzmy na sztuczkę wektorową w stylu STL dla przykładu, jeśli niekoniecznie jest to cudownie przykładowy przykład.

1

zapisu:

int& operator[](int i) 
    { 
     // Do stuff here 
    } 
Powiązane problemy