Члены в классе инициализируются в порядке их определения в классе.Таким образом, если у вас есть
class A
int t
int u
int v
A() : v(0), u(1), t(2) {}
Тогда, несмотря на порядок, в котором вы пишете аргументы конструктора, сначала будет установлено значение t, затем значение u и, наконец, значение v.
Так что, если вы измените порядок определения вашего класса на:
class MyClass
{
public:
MyClass() : m_( MyClass::Create( &a_, &b_, &c_ ), &::CloseHandle )
{
};
private:
static HANDLE Create( DWORD* a, DWORD* b, DWORD* c )
{
DWORD a1, b1;
HANDLE h;
*c = ::SomeInitializationFunction( &h, &a1, &b1 );
if( *c == 0 )
{
*a = a1;
*b = b1;
return h;
}
return NULL;
};
DWORD a_;
DWORD b_;
DWORD c_;
boost::shared_ptr< void > m_;
};
, тогда ваш конструктор должен быть в порядке.
Я бы предложил добавить комментарий о том, что естьзависимость в инициализации членов вашего класса, чтобы люди, читающие код, знали, что не нужно возиться.