Использование статической функции инициализатора - PullRequest
1 голос
/ 11 августа 2010

В этом надуманном примере у меня есть статическая функция инициализации, которая запускается во время построения.

Я хотел бы знать, является ли это законным способом инициализации a_, b_ и c_.Или это слишком рано в процессе строительства, чтобы использовать их таким образом?

DWORD SomeInitializationFunction( HANDLE*, DWORD*, DWORD* );

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;
    };

    boost::shared_ptr< void > m_;
    DWORD a_;
    DWORD b_;
    DWORD c_;
};

Спасибо, PaulH

1 Ответ

2 голосов
/ 11 августа 2010

Члены в классе инициализируются в порядке их определения в классе.Таким образом, если у вас есть

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_;
};

, тогда ваш конструктор должен быть в порядке.

Я бы предложил добавить комментарий о том, что естьзависимость в инициализации членов вашего класса, чтобы люди, читающие код, знали, что не нужно возиться.

...