假设以下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)
答案 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;