本文主要实现的功能为: 把函数当做形参进行传递,并且调用。
步骤如下:
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;
};
#endif
2:形参类的实现文件
#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());
}