The best thing to do is to throw an exception. That's what they're there for, and any attempt to duplicate the behavior you get is likely to fail somewhere.
If you can't use an exception, for some reason, use nothrow
. The example in the Standard, 18.4.1.1 clause 9, is:
t* p2 = new(nothrow) T; // returns 0 if it fails
This is technically a form of placement new, but it should either return a fully formed object or a null pointer that you need to test for, except that nobody will.
If your class can have an object that is there but not properly initialized, you can have a data member that serves as a flag as to whether the class is useful or not. Again, nobody will check that flag in live code.
Bear in mind that, if you really need to have an allocation that is guaranteed not to fail, you need to allocate the memory ahead of time and use placement new, and remove all initialization that might throw to another routine, which somebody will fail to call. Anything that allocates memory can fail, particularly on the more confined sorts of systems that usually don't support exceptions.
Really, the exceptions are the best way to go.