来自void *的铸造类型

时间:2013-08-03 21:03:53

标签: c++ cocos2d-x

根据我的理解,这应该有效:

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

2 个答案:

答案 0 :(得分:2)

看起来您没有正确使用API​​。

文档says您需要使用SEL_CallFuncND类型的回调,receives two arguments而不是一个。{3}}。

为了方便每个人,callfuncND_selector is a macro that hides a static_cast,或者甚至可能是C风格的演员(无法在线找到其他API版本),它允许您将任何内容用作回调而不会出现任何编译错误。纯粹的快乐。

答案 1 :(得分:0)

这甚至不会编译,因为你将const指针传递给接受非const指针的函数。如果你不能改变回调的类型,那么不要传递字符串文字,而是传递一个字符数组。

char buffer[100];

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

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

相关问题