如何从void *中测试课程

时间:2014-02-02 22:09:40

标签: c++ c++11 clang

假设以下API:

CClassA(const CClassA& inCCA);
CClassA(void *inData);

我们如何确保无人使用指向CClassA对象的指针调用void *构造函数,即检测CClassA *instance; new CClassA(instance)之类的调用?

我想在(void)构造函数中检查 - 并抛出错误 - 如果API使用不正确,但是dynamic_cast不能作为编译器对raw void *起作用(至少是clang)抱怨:
'void不是一个班级

测试时if (dynamic_cast<CClassA*>(inData) != NULL)

以下编译 - 但它是否有意义,即它是一个有效且正确的构造,并且总是在运行时正确评估。?

if (dynamic_cast<CClassA*>( (CClassA*)inData ) != NULL)

1 个答案:

答案 0 :(得分:4)

添加私有构造函数:

private:
    CClassA(CClassA *forbidden);

您将无法编译:

 error: calling a private constructor of class 'CClassA'
  CClassA *instance; new CClassA(instance);

编辑:

由于您提到了C ++ 11标记,因此可以将其删除:

    CClassA(CClassA *forbidden) = delete;

这会触发不同的编译时错误:

error: call to deleted constructor of 'CClassA'
  CClassA *instance; new CClassA(instance);
                     ^       ~~~~~~~~
note: 'CClassA' has been explicitly marked deleted here
  CClassA(CClassA *) = delete;