声明全局变量,在方法中初始化

时间:2013-07-16 21:09:21

标签: c++ global-variables static-libraries thrift

我正在创建一个thrift客户端,它有很多开销:TSocketTBufferedTransportTBinaryProtocol。通常它是这样创建的

示例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。这也意味着我必须使mysocketmytransportmyprotocolclient所有全局变量,但我还想将mysocket设置为ip其他而不是“localhost”,这意味着在方法中初始化mysocket。有什么想法吗?

PS。另外,有人知道在打开和关闭静态库时我可以自动调用init()exit()吗? [解决]

编辑:我忘了提到我无法初始化mysocket直到我知道正确的ip,所以我认为我不能将mysocket声明为全局变量

2 个答案:

答案 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;
};