First, I will join the others and say that moving all the code from structures to classes may not be the best move. If you were to do it well (that is, more than just changing struct X {
with class X { public:
) that means redesigning the application (more or less a complete rewrite).
This involves introducing new bugs, new development cycles, extra testing, changing documentation and so on.
Second, considering you may have valid reasons for doing this (for me "just for fun" and "to see if I can do it" can be valid reasons in some situations :D) here are my answers to your questions:
1. What are the general guidelines for doing this migration?
2. What are all the essential things I should keep in mind?
Guidelines and things to keep in mind:
work in very small iterations, and make sure the application is functional between iterations. If you have unit-tests defined, you can work your way through them (pick one unit, redesign following a set of steps (see below), then adapt and run the tests.
pick one area of your code and finish it.
try to follow these steps for each change:
- analyze functionality and redesign
- create the new implementation in parallel with the old one
- switch in the new implementation everywhere the old one is used
- test that the application still works
- remove the old code
- test that the application still works
If you're not doing it at the moment, start using a branching source-control software. Nothing less quite cuts it. I recommend Mercurial, but I understand GIT has about the same features.
You can thank me later :o).
Perform changes transactionally (start with one area and finish it, without adding changes from other areas while the changes for the first one are half-way through). If you use a branching source-control and multiple developers you can have one change/area per developer at a time, then centralize the changes.
Advantages of a refactoring methodology:
the application stays functional if you decide half-way through that the effort is not worth it (or if management decides the effort is not worth it)
the stability of the application remains manageable through the changes
If you establish some milestones this should be quite manageable.
Good luck!