1

我正在创建一个节俭客户端,它有一堆开销: a TSocket、 aTBufferedTransport和 a TBinaryProtocol。通常它是这样创建的

节俭客户端示例

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());
    }
}

但是,对于我的客户,我希望它采用静态库的形式。因此,没有 main 方法,我创建了 openinit()exit()close 方法mytransport。这也意味着我必须创建mysocketmytransportmyprotocolclient所有全局变量,但我还想设置mysocket为“localhost”以外的 ip,这意味着mysocket在方法内部进行初始化。有任何想法吗?

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

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

4

2 回答 2

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;

主文件

#include "mylib.h"
#include <iostream>

using namespace std;

int main(){
  cout << "client.testmethod()" << endl;
  return 0;
}

输出

call open()
client.testmethod()
call close()

在实现文件中构造初始化对象是实现您正在寻找的东西的常用方法。本质上,构造函数 forclass libClosure成为您的入口点,而析构函数 forclass libClosure成为您的出口点。

这样做的原因是因为头文件的所有实现文件都必须在main()运行之前构造它们的全局变量。您不能保证一个实现文件将在另一个之前构造/销毁,但您知道实现文件中的所有对象都必须在某个时间点之前构造main(),并在某个时间点之后销毁main()

于 2013-07-16T21:48:41.590 回答
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;
};
于 2013-07-17T22:04:04.653 回答