我可以在构造函数的初始化列表中执行完整性检查吗?

时间:2012-01-26 04:41:51

标签: c++ assert

一般鼓励使用初始化列表。现在让我们说我有以下代码(简单的例子只是为了让问题更清楚):

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

  /* code and members here */
};

我想检查a在尝试取消引用它以获取val之前不为NULL。我有什么方法可以在那里进行健全检查吗?

2 个答案:

答案 0 :(得分:5)

Use the ternary operator

#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 :(得分:1)

您可以尝试:

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

或者,如果a==nullptr是编程逻辑中的错误,则可以在对调试版本进行单元测试时使用assert()来捕获它。