Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果有人在C+;中调用方法,则强制执行错误(编译时)+;_C++_C++11_Cocos2d X - Fatal编程技术网

C++ 如果有人在C+;中调用方法,则强制执行错误(编译时)+;

C++ 如果有人在C+;中调用方法,则强制执行错误(编译时)+;,c++,c++11,cocos2d-x,C++,C++11,Cocos2d X,免责声明:CCNode类是cocos2d-x框架的一部分,我没有设计它 基类CCNode有一个init方法: virtual bool init(); virtual bool init(int, int); 我的派生类需要两个参数,因此我声明了一个新的init方法: virtual bool init(); virtual bool init(int, int); 我想强制使用新的init(inta,int)而不是原来的init。 我知道我可以选择使用默认参数调用新的,但在上下文中感觉

免责声明:CCNode类是cocos2d-x框架的一部分,我没有设计它

基类CCNode有一个init方法:

virtual bool init();
virtual bool init(int, int);
我的派生类需要两个参数,因此我声明了一个新的init方法:

virtual bool init();
virtual bool init(int, int);
我想强制使用新的init(inta,int)而不是原来的init。 我知道我可以选择使用默认参数调用新的,但在上下文中感觉不太对劲

我正在寻找一种方法,如果有人试图调用init(int,int),告诉用户“改为调用init”。我宁愿在编译时得到它,也不愿在运行时得到它


我尝试过C++11的
静态断言(false,“message”)
,但没有调用它就失败了…

听起来你有源代码访问权限,因为你尝试在那里粘贴静态断言?我认为你能做你想做的事情的唯一方法就是模板化有问题的函数。在模板化函数中放置静态断言是确保其不可编译的好方法

另一种选择是在类的private部分隐藏声明

最后,运行时断言是我实现您要求的操作的最常见的方法


如果您没有init函数的源代码访问权限,那么我真的不认为您可以按要求执行。

如果您真的想阻止有人调用标准节点方法,我认为您应该私下继承它。然而,更cocosy的方法是从create方法调用新的init,这是构建对象时外部代码唯一应该调用的方法。

您的设计看起来有缺陷。如果您有一个指向某个派生对象的
CCNode
指针,该怎么办?您是否仍然能够调用
init()
?它会做什么?它是否应该分派到
init(int,int)
?明确地说?这里真正的问题是你想要实现什么?*。一个比这更好的解决方案肯定存在。可能是@mwerschy的复制品不是复制品(至少不是复制品)。@mwerschy你读错了。另外,这个问题是关于visual C++和自由函数的。哦,顺便说一句,一个解决方案是继承
private
ly,但我仍然认为这个设计是有缺陷的。有很多代码(框架和我的)使用这个基类,所以修改它以包含一个模板感觉不太好是的,对于大型框架来说,这可能不是一个好的选择,但这是唯一能完全按照你的要求去做的方法。否则,函数将始终编译并触发静态断言。您的建议(如果我没有弄错的话)声明但不定义方法不会起作用。即使从未调用该方法,代码(至少在MSVC12中)也不会编译。链接器将在创建派生实例时尝试解析派生::init(void),并错误退出。