Могу ли я выполнить проверку работоспособности в списке инициализатора конструктора? - PullRequest
5 голосов
/ 26 января 2012

Использование списков инициализаторов рекомендуется в целом. Допустим, у меня есть следующий код (простой пример, чтобы прояснить вопрос):

class foo
{
  public:
    foo(ptr1* a, ptr2* b) : m_a(a), m_b(b), m_val(a->val) {}

  /* code and members here */
};

Я хотел бы проверить, что a не NULL, прежде чем попытаться разыменовать его, чтобы получить val. Есть ли какой-нибудь способ, которым я могу провести проверку работоспособности?

Ответы [ 2 ]

5 голосов
/ 26 января 2012

Используйте троичный оператор :

#include <cstdio>

class Test
{
    int x;

public:

    Test(int *px)
    : x (px ? *px : -1)
    {
        printf("%d\n", x);
    }
};

int main(int argc, char *argv[])
{
    Test(NULL);
    return 0;
}

Приведенные выше примеры выходных данных -1.

1 голос
/ 26 января 2012

Вы можете попробовать:

foo(ptr1* a, ptr2* b) : m_a(a), m_b(b), m_val(a==nullptr ? 0 : a->val) {}

В качестве альтернативы, если a==nullptr является ошибкой в ​​логике программирования, вы можете использовать assert () для ее обнаружения во время модульного тестирования ваших отладочных сборок.

...