I want to create n "enemies" (n chosen in run time) in a random position using first constructor (that has a rand() to initialize the xy position.
However, if I use both vector or pointers + new, it generates n object with same xy cohordinates (i.e. n copies of the same object).
The time function returns the time in seconds so it is likely that you are passing the same seed to srand each time. The same seed means you'll get the same sequence of "random" numbers from rand(), which explains why all your elements get the same set of coordinates.
Normally srand should only be called once in a program, before the first call to rand(). At the beginning of main() is usually a good place to call it.
Every time you invoke the Elementi::Elementi(bool f, bool p, int max_dim) constructor, you seed the random number generator with the current time, in seconds. This means that, if you invoke the constructor multiple times within the same second, you re-seed the RNG with the same number - and, therefore, get the same "random" numbers.
In your final code example, you're not re-seeding the RNG, so you get different random numbers on each iteration of the loop.
You should seed the RNG once, at the start of your program, not over and over.
Your problem with the same x/y coordinates stems from the wrong use of srand(time(NULL));. Within the same second it will have the same seed and hence rand() will produce the same numbers. To produce different numbers per call of rand() you should move srand(...) to the top of main and call it just once.