+3  A: 

first is a Block pointer so you only need to pass in index.

Block* first; ...

first[0] //returns the first element
first[1] //returns the second element

In your example you are passing in too high of an index value when indexing first because you're using sizeof inside.

Corrected code:

Block& BlockList::operator[](int index) {
    try {
        if (index >= size)
         throw out_of_range("index out of range");
        else 
         return (first[index]);//<--- fix was here
    }
    catch(exception& e) {
        cerr << e.what() << endl;
    }
}
Brian R. Bondy
+1  A: 

An array knows how big its elements are, so you don't have to do the math with sizeof(Block). Just use i as the index.

On a related note, the C++ FAQ Lite has a great section on operator overloading that covers all kinds of useful stuff.

Kristo