如何从void*测试类

How to test class from void*

本文关键字:测试类 void      更新时间:2023-10-16

假设以下API:

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

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

我想在(void)构造函数中检查 - 并丢弃错误 - 如果API使用不正确,但是dynamic_cast在原始void*上不起作用,因为编译器(至少Clang确实)抱怨:
'void不是类'

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

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

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

添加一个私有构造函数:

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;