Your basic loop is fine.
If I were using C++, I'd probably hold a list of objects that responded to input and define a virtual function in an ancestor so that I could provide the objects with their input (sounds like PocketFrog's way of doing things, from your desription - I've not looked it PFrog). Actually, if you didn't have many objects that you throw input at, it might be cleaner to use multiple inheritance for those objects to get their input function.
I wouldn't check the input per object. Just have a loop after the input that throws it at all of the relevant objects...
I probably wouldn't make an "input controller" because the coupling would be too high.