I guess the red herring in the bits class (together with its name) is operator[]. This confuses the responsibilities of either class, and allows weirdness like:
Code:
twiddler x(8);
bool b = x[0][3]; //so, which bit do we want to access?
Good design would strive to make such nonsense a compile-time error (which would be achieved by not overloading [] in bits).
Another issue I have is with operator* in the twiddler class. Unary * means dereferencing and is there for classes that act like pointers (to dereference an iterator or a smart pointer).
So yeah, your friend does seem to have a tendency to misname functions/classes and cause confusion.
OTOH, the code works. This is how you can access bits with the array syntax.