Other than the most obvious
- Object Oriented Programming
Organisation
Start your project by declaring classes, base and sub classes so you can keep a organized structure and delegate functionality and responsibility to each and one of the classes, this goes as well for every independent function in your project.
Scoping, Encapsulation
Functions or classes that are not independent shouldn't either be exposed to any other parts to your project than from which they depend on. By restricting access to them, by using scoping, you avoid unnessesary exposure and by that possibilities for bugs and by that time to debug. As a rule, keep things as private as possible.
Constants
Another debugging horror is to find out bugs in all functions called within a statement or an algoritm in general, if you pass a pointer or a reference, you will never know what happens to it. By declaring Constant pointers, constant references you restrict the function from changing the parameters, by declaring constant methods you restrict the method from manipulating the member variables, which in turn enables you to use the method if the object is passed constant.
Black box analogy
Each class and function that is exposed to a certain scope should maintain the black box analogy, that is it is responsible of returning correct output for each possible input passed from its environment. Usually programmers won't take this too seriously, and it's usefulnes only shows as your project grows, but if you even plan to do something more advanced, start using this technique and you'll save tons of time on unnessesary debugging.
To maintain the black box analogy, you use error handlilng, you trap all false input and return error codes, use try-catch statements or assertions to effectively get rid of the most common invalid inputs. When calling functions that give feedback on error codes, you should handle them as well as soon as possible, in case you're using try-catch which i personaly don't like.