本文主要實(shí)現(xiàn)的功能為: 把函數(shù)當(dāng)做形參進(jìn)行傳遞,并且調(diào)用。
步驟如下:
1:首先聲明一個(gè)函數(shù)指針 函數(shù)原型為 void 函數(shù)名(string str) 無(wú)返回值,一個(gè)string參數(shù)
typedef std::function<void(string str)> httPRequest_SuccessOrFail_callback;
2:聲明2個(gè)回調(diào)函數(shù)
httpRequest_SuccessOrFail_callback m_success_callback = nullptr;httpRequest_SuccessOrFail_callback m_fail_callback = nullptr;
3:在符合條件的時(shí)候調(diào)用回調(diào)函數(shù)
this->m_success_callback("test success");
this->m_fail_callback("test error");
4:把實(shí)參(實(shí)參為函數(shù))傳遞給形參
(1)形參聲明:
void connectServer(const char* address, const char* postData, bool isSetHeader,const httpRequest_SuccessOrFail_callback &successCallback, const httpRequest_SuccessOrFail_callback &failCallback);
(2)實(shí)參傳遞給形參
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,一共兩個(gè)類(結(jié)合cocos的httpclient進(jìn)行的測(cè)試,在聯(lián)網(wǎng)成功或者失敗后,調(diào)用不同的回調(diào)函數(shù))
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*/////定義成員函數(shù)指針 //typedef void (cocos2d::Ref::*SELF_CallBack)();//#define m_callFunc_selector(_SELECTOR) (SELF_CallBack)(&_SELECTOR) //把m_call(方法的全名為---類名:函數(shù)名) 括號(hào)中的取地址,然后強(qiáng)轉(zhuǎn)//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::)為強(qiáng)制轉(zhuǎn)換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端返回來(lái)的數(shù)據(jù) 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:形參類的實(shí)現(xiàn)文件
#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 服務(wù)器返回的數(shù)據(jù): %s", result.c_str()); //接收服務(wù)端返回來(lái)的數(shù)據(jù) this->httpServerData = result; //(this->*m_success_callback)();//"success" //實(shí)際調(diào)用 this->m_success_callback("test success");}3:實(shí)參類的頭文件
#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:實(shí)參類的實(shí)現(xiàn)文件
#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());}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注