First off, your situation isn't at all unusual. Most, perhaps all, programmers will experience a moment when they realise that the basic book knowledge that they've acquired by slogging through some weighty tome seems to have left them entirely unprepared for making the jump to "real" coding and problem solving. I went through it, you're going through it, and I'd wager that 99% of the people who contribute to stackoverflow have gone through it at some stage or another.
The bad news is that there's no simple, surefire way to proceed from being someone who's read a few books to being someone who can actually implement that knowledge in real, living, breathing code. The good news is that with some perseverance and the right attitude, you'll eventually make that leap too.
Here's my experience. I started out in pretty much the same way as you, reading lots of books and taking some classes. There were a few steps I took to get to the stage where I finally felt confident in thinking of myself as a semi-decent programmer:
1) It helps to have some sort of idea of what you want to end up doing. Once you have a goal to aim at, learning becomes much, much easier. In my case, I was a physics student who knew that once I finished my (formal) education, I wanted to go to work designing and implementing automated trading systems. (Hey, I'm greedy, I admit!) That helped me to see that I'd benefit from learning as much C++ as possible, as well as knowing a thing or two about networking, concurrency, and machine learning. In other words, having a specific goal in mind helped me to identify the steps I needed to get there. I tailored my actions and education accordingly.
2) I took every opportunity to actually work as a programmer. Vacation jobs doing even seemingly meaningless code maintenance turned out to be invaluable experiences since I saw how code is actually written by real people (which is a huge help in bridging the gap between what you learn from a book and how that knowledge is applied in the real world).
In addition, I benefited immensely from having actual, experienced coders to talk to. Having someone next to you who can explain exactly what happens in a build process, the importance of documentation, or what the compiler is really doing when you pass it some obscure flag is truly invaluable. Reality really is the highest-bandwidth communication channel you can get your hands on!
3) I started contributing to a specific open source project that was relevant to my area of interest. This, actually, was the most difficult part since I was coming into a pretty huge existing codebase and didn't have the benefit of having someone who already understood the architecture sitting next to me in the office. Open-source involvement is a great way to learn, but it takes more effort than many people would lead you to believe.
4) Be realistic, hard-working, and above all, humble. Becoming even a semi-competent C++ programmer took me three years of hard work. It took longer than I expected. It was frustrating, demoralizing, and downright horrible at times, especially at the start. But I stuck with it and kept looking to learn from others. It was not only a great experience but turned out to be pretty lucrative as well. And learning C++ gave me the confidence to go on and learn other languages too (C#, Java, Erlang, Scala, Python, and the like).
Good luck with it. You'll get there in the end.