本文主要实现的功能为: 把函数当做形参进行传递,并且调用。
步骤如下:
1:首先声明一个函数指针 函数原型为 void 函数名(string str) 无返回值,一个string参数
typedef std::function<void(string str)> httPRequest_SuccessOrFail_callback;
2:声明2个回调函数
httpRequest_SuccessOrFail_callback m_success_callback = nullptr;httpRequest_SuccessOrFail_callback m_fail_callback = nullptr;
3:在符合条件的时候调用回调函数
this->m_success_callback("test success");
this->m_fail_callback("test error");
4:把实参(实参为函数)传递给形参
(1)形参声明:
void connectServer(const char* address, const char* postData, bool isSetHeader,const httpRequest_SuccessOrFail_callback &successCallback, const httpRequest_SuccessOrFail_callback &failCallback);
(2)实参传递给形参
callback1->connectServer(url.c_str(), "", false,CC_CALLBACK_1(HelloWorld::successCallBack, this), CC_CALLBACK_1(HelloWorld::failCallBack, this));
参考链接:
http://www.gimoo.net/t/1504/55278beacb9af.html
http://blog.csdn.net/dawn_moon/article/details/8546607
----------------------------------------------------------------------------------------------------------------------------------------------------------
下面附上完整的demo,一共两个类(结合cocos的httpclient进行的测试,在联网成功或者失败后,调用不同的回调函数)
1:形参类的头文件
#pragma once#ifndef _TESTSTDBIND_H_#define _TESTSTDBIND_H_#include <functional>using namespace std;#include "cocos2d.h"#include "network/HttpClient.h"#include "network/HttpResponse.h"#include "string"USING_NS_CC;using namespace network;/* date:2017.02.07*/////定义成员函数指针 //typedef void (cocos2d::Ref::*SELF_CallBack)();//#define m_callFunc_selector(_SELECTOR) (SELF_CallBack)(&_SELECTOR) //把m_call(方法的全名为---类名:函数名) 括号中的取地址,然后强转//typedef std::function<void(HttpClient* client, HttpResponse* response)> ccHttpRequestCallback;//typedef void (cocos2d::Ref::*SEL_HttpResponse)(HttpClient* client, HttpResponse* response);//#define httpresponse_selector(_SELECTOR) (cocos2d::network::SEL_HttpResponse)(&_SELECTOR) //(cocos2d::network::)为强制转换typedef std::function<void(string str)> httpRequest_SuccessOrFail_callback;class TestStdBind : public Layer{public: TestStdBind(); ~TestStdBind(); CREATE_FUNC(TestStdBind); virtual bool init() override;public: //void connectServer(const char* address, const char* postData, bool isSetHeader, // std::function<void()> successCallback, std::function<void()> failCallback); ////void connectServer(const char* address, const char* postData, bool isSetHeader, //// SELF_CallBack successCallback, SELF_CallBack failCallback); void connectServer(const char* address, const char* postData, bool isSetHeader, const httpRequest_SuccessOrFail_callback &successCallback, const httpRequest_SuccessOrFail_callback &failCallback); //Http Response Callback void onHttpRequestCompleted(HttpClient *sender, HttpResponse *response1); //server端返回来的数据 string httpServerData = "error";private: //std::function<void()> m_success_callback; //std::function<void()> m_fail_callback; ////SELF_CallBack m_success_callback; ////SELF_CallBack m_fail_callback; httpRequest_SuccessOrFail_callback m_success_callback = nullptr; httpRequest_SuccessOrFail_callback m_fail_callback = nullptr;};#endif2:形参类的实现文件
#include "TestStdBind.h"#include "json/forwards.h"#include "json/value.h"#include "json/writer.h"#include "network/HttpClient.h"#include "network/HttpResponse.h"#include "json/reader.h"#include "CommonDefine.h"#include "Utils/JsonUtils.h"#pragma execution_character_set("utf-8")using namespace network;TestStdBind::TestStdBind(){}TestStdBind::~TestStdBind(){ HttpClient::destroyInstance();}bool TestStdBind::init(){ if (!Layer::init()) { return false; } return true;}void TestStdBind::connectServer(const char* address, const char* postData, bool isSetHeader, const httpRequest_SuccessOrFail_callback &successCallback,const httpRequest_SuccessOrFail_callback &failCallback){ this->m_success_callback = successCallback; this->m_fail_callback = failCallback; HttpRequest* request = new (std::nothrow) HttpRequest(); request->setUrl(address); request->setRequestType(HttpRequest::Type::POST); request->setResponseCallback(this, httpresponse_selector(TestStdBind::onHttpRequestCompleted)); if (isSetHeader) { std::vector<std::string> headers; headers.push_back("Content-Type: application/json; charset=utf-8"); request->setHeaders(headers); } request->setRequestData(postData, strlen(postData)); //log("requestURL %s postStr %s", request->getUrl(), postData); request->setTag("Post_My_Data"); cocos2d::network::HttpClient::getInstance()->setTimeoutForConnect(JsonUtils::getFloatFromJson("httpConnectTimeOut")); cocos2d::network::HttpClient::getInstance()->setTimeoutForRead(JsonUtils::getFloatFromJson("httpReadTimeOut")); HttpClient::getInstance()->send(request); request->release();}void TestStdBind::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response1){ HttpResponse *response = response1; if (!response || !response->isSucceed()) { log("error buffer:%s", response->getErrorBuffer()); this->m_fail_callback("test fail"); return; } vector<char> *buffer = response->getResponseData(); string result(buffer->begin(), buffer->end()); log("MyHttpPost::onHttpRequestCompleted 服务器返回的数据: %s", result.c_str()); //接收服务端返回来的数据 this->httpServerData = result; //(this->*m_success_callback)();//"success" //实际调用 this->m_success_callback("test success");}3:实参类的头文件
#pragma once#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "Scene/httpInterface/MyHttpPost.h"#include "TestStdBind.h"/* @date : 2016.10.12*/class HelloWorld : public cocos2d::Layer{public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // implement the "static create()" method manually CREATE_FUNC(HelloWorld);private: void testCallBack(); void successCallBack(string str); void failCallBack(string str);private: TestStdBind* callback1 = nullptr;};#endif // __HELLOWORLD_SCENE_H__4:实参类的实现文件
#include "HelloWorldScene.h"#include "Scene/httpInterface/MyHttpPost.h"#include "update/HttpClientDownLoadAPK.h"#include "CommonDefine.h"#include "Scene/LogoScene.h"#include "update/AssetsManagerResource.h"#include "TestStdBind.h"#include "Utils/JsonUtils.h"#include "Data/GameManager.h"USING_NS_CC;#pragma execution_character_set("utf-8")Scene* HelloWorld::createScene(){ auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene;}bool HelloWorld::init(){ if ( !Layer::init() ) { return false; } this->testCallBack(); return true;}void HelloWorld::testAES(){}void HelloWorld::testCallBack(){ callback1 = TestStdBind::create(); std::string url = StringUtils::format("%s/gm-web/app/ask/update/%s/%s", JsonUtils::getStringFromJson("serverURL").c_str(), GameManager::getInstance()->getAppName().c_str(), UserDefault::getInstance()->getStringForKey(ResourcesVersion,"1.0.0").c_str()); this->addChild(callback1); //callback1->connectServer(url.c_str(), "", false, [=](){ // //log("返回成功111 %s ==", callback1->httpServerData.c_str()); //}, [=](){ // log("返回失败111 %s ==", callback1->httpServerData.c_str()); //}); callback1->connectServer(url.c_str(), "", false, CC_CALLBACK_1(HelloWorld::successCallBack, this), CC_CALLBACK_1(HelloWorld::failCallBack, this));}void HelloWorld::successCallBack(string str){ log("%s",str.c_str()); log("返回成功222 %s ==", callback1->httpServerData.c_str());}void HelloWorld::failCallBack(string str){ log("%s", str.c_str()); log("返回失败222 %s ==", callback1->httpServerData.c_str());}
新闻热点
疑难解答