假设以下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/