From what I have understood from your original post and the other clarifications, I think you want to create an Arrow at the position of sourceEntity and make it move with constant arrowSpeed towards the position of targetEntity until it reaches it, position which may have changed from the creation of the Arrow. Correct me if I am wrong.
I see that you are using a float for the Speed of your arrow, instead of a vector.
You can use a 2D vector equal to the difference between the target position and the current arrow position, calculate it's magnitude(or length), and then add to Arrow.currentPosition a fraction of v vector equal to arrowSpeed / length :
Vector2 v = targetEntity.currentPosition - Arrow.currentPosition;
float length = sqrt( v.x*v.x + v.y*v.y );
Arrow.currentPosition += ( v * ( arrowSpeed / length ) );
When updating the Arrow's current position, you may want to have the targetEntity passed by reference, so you will have access to the targetEntity's current position. If you don't pass it by reference, the targetEntity's position will always remain the same and your Arrow will stop at targetEntity's original position.
The Arrow will eventually end the chase and hit targetEntity.
For the code you are using, Arrow.TargetX and Arrow.TargetY need to be pointers, instead of floats. Then, you do it like this:
//mark the minion that the click was made on
theCurrentTarget = &enemyMinions[i];
//sets the arrow.targetEntity to that particular minion
arrow.TargetX = &theCurrentTarget->X;
arrow.TargetY = &theCurrentTarget->Y;
theCurrentTarget also needs to be a pointer.
You will need to make some changes in how you create an arrow, using the constructor:
Say you have 2 objects of class Minion: Entity1 and Entity2. Entity1 is the source of the arrow and always stays in the same spot. Entity2 is the target of the arrow and it is moving.
public Arrow(Texture2D sprite, Vector2 sourceEntity, Vector2 targetEntity, float arrowSpeed, int arrowAttackSpeed, int damageDone, bool isArrowActive)
Say you create an Arrow object, like this:
Arrow chasingArrow( some_sprite, Entity1.position, Entity2.position, ...(the rest of the arguments are irrelevant) )
When you call this constructor, the object of class Arrow that you create will save the value of the targetEntity vector as it is now and that value (which is inside the Arrow object) will never change, even if the value of the vector inside the Entity2 object will change. You need to link the vector in Entity2 with the targetEntity vector in chasingArrow. You do that by not copying the value, but by copying the pointer. That way, the targetEntity pointer in chasingArrow will always point to the current position of Entity2.
Change the constructor like this:
public Arrow(Texture2D sprite, Vector2 sourceEntity, Vector2* targetEntity, float arrowSpeed, int arrowAttackSpeed, int damageDone, bool isArrowActive)
Notice the only modification: Vector2* targetEntity. Now it will take a pointer to a vector as a parameter instead of a vector.
And when you create an Arrow object, do it like this:
Arrow chasingArrow( some_sprite, Entity1.position, &Entity2.position, ...(the rest of the arguments are irrelevant) )
You can also pass Entity1.position by reference, but it works as it is now, since the sourceEntity only matters at the moment the Arrow is created.
If you have any other questions, just ask.