This example demonstrates a use of operator overloading with the [] (array indexing) operator. We create an object class (store_array_doc) that includes in its member data a 100-element floating-point array, initially populated with random values. The object class’ overloaded array indexing operators allow you to insert or retrieve individual scalar array values, using familiar array syntax.

The store_array_doc object definition and operator overloading code listed in this section is contained in the procedure file store_array_doc__define.pro, and is located in the examples/doc/objects subdirectory of the IDL distribution. To view the file in an IDL editor window, enter .EDIT store_array_doc__define.pro at the IDL command line.

The following code, which is a portion of store_array_doc__define.pro, defines the overloaded [] (array indexing) operator methods for the store_array_doc object class.

The _overloadBracketsRightSide function interprets the array index as an index into the member data array and returns the value of the specified array element:

FUNCTION store_array_doc::_overloadBracketsRightSide, isRange, $
   sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8
 
   IF N_ELEMENTS(isRange) GT 2 THEN BEGIN
      RETURN, 'Only two indices are supported'
   ENDIF
 
   IF (MAX(isRange) GT 0) THEN BEGIN
      RETURN, 'Subscript Ranges are not allowed'
   ENDIF
 
   IF N_ELEMENTS(sub1) THEN retVal = self.ARRAY[sub1]
   IF N_ELEMENTS(sub2) THEN retVal = [ret, self.ARRAY[sub2]]
 
   RETURN, retVal
 
END

The _overloadBracketsLeftSide procedure interprets the array index as an index into the member data array and changes the value of the specified array element. If the single index zero is provided, the original object is replaced by the specified value.

PRO store_array_doc::_overloadBracketsLeftSide, objRef, rValue, $
   isRange, sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8
 
   IF N_ELEMENTS(isRange) GT 2 THEN BEGIN
      PRINT, 'Only two indices supported by this example operator'
      RETURN
   ENDIF
 
   IF (MAX(isRange) GT 0) THEN BEGIN
      PRINT, 'Subscript Ranges are not allowed'
      RETURN
   ENDIF
 
   IF N_ELEMENTS(isRange) EQ 1 && (sub1 EQ 0) THEN BEGIN
      PRINT, 'Replacing original object with specified value'
      OBJ_DESTROY, objRef
      objRef = rValue
   ENDIF ELSE BEGIN
      PRINT, 'Replacing elements in the object data array'
      IF (N_ELEMENTS(sub1) && N_ELEMENTS(rValue) GT 0) $
         THEN self.ARRAY[sub1] = rValue[0]
      IF (N_ELEMENTS(sub2) && N_ELEMENTS(rValue) GT 1) $
         THEN self.ARRAY[sub2] = rValue[1]      
   ENDELSE
 
END
 

The following code snippet creates a store_array_doc object and displays the value of the 10th element in the member data array:

myObj = OBJ_NEW('store_array_doc')
PRINT, myObj[9]

The following code snippet replaces the value of the 10th element and prints out the new value:

myObj[9] = 3.14159
PRINT, myObj[9]

The following code snippet replaces the entire object with a string:

myObj[0] = 'Now the object is gone'
HELP, myObj

IDL Prints:

MYOBJ           STRING    = 'Now the object is gone'