假设以下API:

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


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

我想在(void)构造函数中检查-并抛出一个错误-如果API使用不正确,但是dynamic_cast在原始void *上不起作用,因为编译器(至少是clang如此)抱怨:
“无效不是阶级”

在测试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;

关于c++ - 如何从无效测试类(class)*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21516916/

10-11 21:06