我正在创建一个thrift客户端,它有很多开销:TSocket
,TBufferedTransport
和TBinaryProtocol
。通常它是这样创建的
示例Thrift客户端
int main(int argc, char **argv) {
shared_ptr<TTransport> mysocket(new TSocket("localhost", 9090));
shared_ptr<TTransport> mytransport(new TBufferedTransport(mysocket));
shared_ptr<TProtocol> myprotocol(new TBinaryProtocol(mytransport));
TestServiceClient client(myprotocol);
try {
mytransport->open();
client.testmethod(); //and you can call server methods like so
mytransport->close();
}catch (TException &tx) {
printf("ERROR: %s\n", tx.what());
}
}
但是,对于我的客户端,我希望它以静态库的形式出现。因此,没有主要方法,我创建了init()
和exit()
方法来打开和关闭mytransport
。这也意味着我必须使mysocket
,mytransport
,myprotocol
和client
所有全局变量,但我还想将mysocket
设置为ip其他而不是“localhost”,这意味着在方法中初始化mysocket
。有什么想法吗?
PS。另外,有人知道在打开和关闭静态库时我可以自动调用init()
和exit()
吗? [解决]
编辑:我忘了提到我无法初始化mysocket
直到我知道正确的ip,所以我认为我不能将mysocket声明为全局变量
答案 0 :(得分:1)
在更彻底地阅读问题之后,我认为这可能更符合您的要求:
mylib.h
class libClosure{
public:
libClosure();
~libClosure();
};
mylib.cpp
#include "mylib.h"
#include <iostream>
using namespace std;
libClosure::libClosure(){ cout << "call open()" << endl;}
libClosure::~libClosure(){ cout << "call close()" << endl;}
libClosure __lc;
的main.cpp
#include "mylib.h"
#include <iostream>
using namespace std;
int main(){
cout << "client.testmethod()" << endl;
return 0;
}
输出
call open()
client.testmethod()
call close()
在实现文件中构造初始化对象是实现您正在寻找的内容的常用方法。从本质上讲,class libClosure
的构造函数将成为您的入口点,class libClosure
的析构函数将成为您的退出点。
这样做的原因是因为标头的所有实现文件必须在运行main()
之前构造其全局变量。您不能保证在另一个实现文件之前构造/销毁一个实现文件,但是您知道实现文件中的所有对象必须在某个点main()
之前构建,并在之后被破坏在某些时候main()
。
答案 1 :(得分:1)
我最终自己解决了这个问题。即使使用像Aggieboy建议的静态局部变量似乎完全有效,我认为这有点简单:
准系统版
shared_ptr<TTransport> mysocket(createTSocket());
TSocket* createTSocket() {
//init stuff goes here, for example
string ip = "localhost"
int port = 9090
return new TSocket(ip,port)
}
完整代码(好吧,大部分内容)
class ThriftProxy {
public:
ThriftProxy() :
trans(createTSocket()),
proto(new TBinaryProtocol(trans)),
client(proto)
{
trans->open();
}
TSocket* createTSocket() {
//default: ip = "localhost", port = 9090
string ip = "localhost";
int port = 9090;
//get ip and port from a text file
return new TSocket(ip, port);
}
~ThriftProxy()
{
trans->close();
}
private:
boost::shared_ptr<TSocket> trans;
boost::shared_ptr<TProtocol> proto;
public:
XtkServiceClient client;
};