Well, having the collision check as a requisite to moving can still occur. Just run the function in your other class where the instance of the object resides in, then pass in the bool as a parameter to your move function.
So, a simple version, In main, you create your objects, check for collision to generate a bool, then to move your object use a function like:
CollideObject::Move(bool collision)
{
if(collision != true)
//move your object
else
//don't move your object
}
passing in the collision bool as a parameter.
Or, still have an Actor.Update() function internal to your Actor Class, but pass in the other objects as parameters. This seems to be what you're trying to do. If you need a reference to other objects, you'll need to pass them in as references to the function. So, in this case, for your actor.update scenario. If you have a vector of tiles, let's say, and want to check them for collisions internally in the class, you'll want to make your Actor.Collision() function take in the vector as a parameter. So:
Actor::Collision(std::vector<Tiles> &tiles)
{
for(int i = 0; i < tiles.size(); i++)
{
if(tiles[i].pos.x < actor.pos.x)//or whatever. check for collision)
actor.move();
else
actor.collide();
}
}
This way you can reference the tiles, other players, whatever you need, as long as you pass in a reference to it. This method raises dependency issues though, that I don't quite feel qualified to dispense advice on. On the surface, you'd need to include headers for each type of class you may want to reference, though that's typically not recommended as I understand it(there are other methods), and you can end up with various dependency issues pretty quickly.
But, personally, I understand how you'd like that all to be internal to the class, but that feels like it's bloating the class unnecessarily. You're treating the object like an object manager. It would just be easier to make an object manager class(even though you said you didn't want something like that), and handle the things internally there. Have the objects created in the object manager class and run collision checks, gravity, movement, etc within that class. It doesn't have to be a singleton. You could still call everything in one function, but then the object doesn't have to reference other instances of itself or of other classes. You won't have to repeat the same code for every type of object (for, say like gravity. Each different class of objects you have, won't have to include the gravity functions within those classes as well). And then just call one function in main like ObjectManager.UpdateObjects(), and within UpdateObjects, run your movement,gravity, etc functions for your character, enemies, gravity, etc.. All the other advice I've given, just swap into your object manager class rather than main.
But, that way, your Actor class is simple and isolated and not entangled with other classes, other dependencies, other states, etc. You can still have an Actor.Update() function, but, if it's dependent on other classes or conditions, call the Actor.Update function higher up on the class hierarchy under those conditions and pass in whatever information you need, if that makes sense.
In other words. If you have two objects, and one needs to know about the state of the other. Run a check function on that outside of those classes, and depending on the outcome, alter your Actor.Update() parameters accordingly. You can think of it as a web of dependencies. But, the more you make each class dependent on another class the more complicated and messy it gets. I try to make it a cleaner hierarchy where the objects are as isolated as possible, and the managers of those objects are the only ones that interact with them. The objects themselves don't really interact with each other, per se. Well, they do, they just don't know it
And, again, I'm rather new myself, so I'm really hoping someone comes in to either validate or correct me here before I rot your mind with poor advice I'll exit the thread here, because you're asking for best practices, and I have no idea if what I've explained qualifies as that(I'm guessing probably not. If it is, it's incidental and just stumbled upon out of trial and error).