K, first off I want to point out that it's useless to declare the SDL_DOUBLEBUF flag with the SDL_SWSURFACE flag - the two are incompatible. Double buffering only works with hardware surfaces (SDL_HWSURFACE). This doesn't affect anything outright, since SDL_Flip() will just call SDL_UpdateRect() rather than flipping the buffers, but just FYI.
Now then, I have a hypothesis as to what your problem is. This function call:
a->SetImage("Player.bmp", a->GetImage());
Is kind of confusing. First of all, you're setting an internal data member of the class, so why do you have to pass in the value that will ultimately be set in the function?
SDL_Surface* Player::SetImage(const char *szNewFile,SDL_Surface *Image){ szFileName = szNewFile; Image = SDL_LoadBMP(szFileName);};
This isn't good. Are you setting CPlayer::Image or the local definition of Image? I'm not 100% sure, but I think you're setting the local definition of Image (defined in the arguments list) rather than CPlayer::Image. In that case, when you call this:
SDL_BlitSurface(a->GetImage(), &dest2, screen, &dest);
You're passing in a null value for the srcrect. This won't cause an error, but it will end up blitting precisely squat.
You can take out the second parameter of both CPlayer::Create and CPlayer::SetImage. You should be setting the internal data member CPlayer::Image anyways.
Oh yea, and you have a huge memory leak in your draw() function. You're allocating memory every single frame but not releasing it. Not good. If you're going to create new instances of CPlayer and GameEngine every frame (not recommended - one instance at the beginning of the app will suffice, for GameEngine anyways), at least call delete at some point to get rid of them.