【问题标题】:Casting types from void*从 void* 铸造类型
【发布时间】:2013-08-03 21:03:53
【问题描述】:

据我了解,这应该可行:

const char* x = "x";
std::cout << x << std::endl;

将 x 传递给这个函数:

void myClass::passAsVoid(void* v) {
    std::cout << (const char*)v << std::endl;
}

第一个例子打印“x”;

第二个例子打印“\350\224A”;

我想了解发生了什么,以及正确的方法!

实际代码:

float delay = 1;
std::string txt = "random filler text that is not lorum ipsum";
for (int i = 0; i < txt.length(); ++i) {
    const char* x = "x";
    std::cout << x << "code1" << std::endl;
    CCSequence* seq = CCSequence::create(CCDelayTime::create(i*delay),
                                         CCCallFuncND::create( this, callfuncND_selector(OverWorldView::setString), (void*)x ),
                                         NULL);
    this->runAction(seq);
}

回调函数:

void OverWorldView::setString(void* x) {
    std::cout << (const char*)x << "code2" << std::endl;
    label1->setString( (const char*)x );
}

我正在使用 cocos2dx 2.1.4

【问题讨论】:

  • 你怎么称呼passAsVoidpassAsVoid("x") 之类的东西?
  • 我能问一下为什么你需要这样做吗?在 C++ 中,您通常不需要这样做。我什至会说,除非您正在处理 C API,否则正确的方法是根本不这样做。
  • 我使用的 api 只接受 void* types =s
  • std::cout &lt;&lt; (const char*)v 应该打印字符串。如果您省略演员表,它只会打印指针地址...您确定这是您的实际代码吗?
  • 试试void OverWorldView::setString(CCNode*, void* x) { /*...*/ }.,只是这个改变(没有包装)。

标签: c++ cocos2d-x


【解决方案1】:

您似乎没有正确使用 API。

文档says你需要使用SEL_CallFuncND类型的回调,其中receives two arguments,不是一个。

为了大家的方便,callfuncND_selectoris a macro that hides a static_cast,或者甚至可能是 C 风格的转换(在网上找不到其他 API 版本),它可以让您使用几乎任何东西作为回调而不会出现任何编译错误。纯粹的快乐。

【讨论】:

  • OP 使用的版本使用 C 风格转换:#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&amp;_SELECTOR) m(static_cast 会在编译时捕获该错误(新版本 3.something 引入了 @987654328 @)。
  • 感谢到目前为止的所有帮助,我之前使用这个精确的回调选择器将向量作为唯一的参数传递并且它有效,我不确定为什么这次没有,这个解决方案似乎有效,但我的代码中仍有一些错误,我必须先解决!
  • “在线找不到其他API版本”是的,我下载了框架(cocos2d-x 2.1.4)并查看了代码,这就是我的报价来源。
  • 对不起,我现在必须运行的每个人,我会在几个小时后再次更新这个问题。
【解决方案2】:

这甚至不会编译,因为您将 const 指针传递给接受非 const 指针的函数。如果您无法更改回调的类型,则不要传递字符串文字,而是传递字符数组。

char buffer[100];

callback(buffer); //buffer decays to char* which is implicitly converted to void*

如果您可以更改回调的类型,则将参数修改为const void*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2012-01-13
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多