Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Poco::Net::HTTPClientSession抛出异常,但没有唯一的\u ptr_C++_C++11_Poco Libraries - Fatal编程技术网

C++ Poco::Net::HTTPClientSession抛出异常,但没有唯一的\u ptr

C++ Poco::Net::HTTPClientSession抛出异常,但没有唯一的\u ptr,c++,c++11,poco-libraries,C++,C++11,Poco Libraries,我有两个版本的代码: // HTTP.h class HTTP { private: //unique_ptr<HTTPClientSession> session; HTTPClientSession session; bool doRequest(Poco::Net::HTTPRequest& request, const string& path, const string& cont

我有两个版本的代码:

    // HTTP.h
    class HTTP
    {
    private:
      //unique_ptr<HTTPClientSession> session;
      HTTPClientSession session;

      bool doRequest(Poco::Net::HTTPRequest& request, const string& path, const string& content, string& responseBody);
    public:
      HTTP(const string& adress);
    }

    // HTTP.cpp

    HTTP::HTTP(const string& adress)
    {
      Poco::URI uri(
        adress.substr(0, 4) == "http" ? adress : "http://" + adress
      );
      //session = make_unique<HTTPClientSession>(uri.getHost(), uri.getPort());
      HTTPClientSession session{ uri.getHost(), uri.getPort() };
    }

    bool HTTP::doRequest(HTTPRequest& request, const string& path, const string& content, string& responseBody) {
      ...
      session.setTimeout(Timespan(5, 0));
      //std::ostream& requestStream = session->sendRequest(request);
      std::ostream& requestStream = session.sendRequest(request);
      ...
    }
//HTTP.h
类HTTP
{
私人:
//独特的ptr会话;
HTTPClientSession;
bool-doRequest(Poco::Net::HTTPRequest和request、常量字符串和路径、常量字符串和内容、字符串和响应库);
公众:
HTTP(常量字符串和地址);
}
//HTTP.cpp
HTTP::HTTP(常量字符串和地址)
{
Poco::URI(
地址substr(0,4)=“http”?地址:“http://”+地址
);
//session=make_unique(uri.getHost(),uri.getPort());
HTTPClientSession会话{uri.getHost(),uri.getPort()};
}
boolHTTP::doRequest(HTTPRequest&request、常量字符串与路径、常量字符串与内容、字符串与响应库){
...
setTimeout(Timespan(5,0));
//std::ostream&requestStream=会话->发送请求(请求);
std::ostream&requestStream=session.sendRequest(请求);
...
}
如果我使用unique_ptr来创建会话对象,就像在注释代码中一样,一切都很好

但如果我只使用简单的变量,就像在当前版本中一样。 然后排队

会话。发送请求(请求)

抛出异常连接被拒绝

我不明白为什么? 你能给我解释一下吗

另外,请求是对静态资源的简单HTTP GET请求

HTTP::HTTP(const string& adress)
{
  Poco::URI uri(
    adress.substr(0, 4) == "http" ? adress : "http://" + adress
  );

  HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
此构造函数的最后一行创建了一个名为
session
的局部变量。。。它在构造函数返回时立即被销毁,与同一成员的类成员无关

因此,当所有操作都完成后,该类实例的
会话
成员仍保持未初始化状态。为便于比较:

session = HTTPClientSession{ uri.getHost(), uri.getPort() };

相反,这将正确初始化类成员,正如您的明显意图所示。但是,由于HTTPClientSession没有可用的赋值运算符,您唯一的选择是继续使用
unique\u ptr
,或者重新构造构造函数,以便它在其初始值设定项列表中构造类成员。

我理解了主要思想,在我的代码中,“session”是本地变量,而不是类成员。但当我尝试像您编写的那样初始化会话时,我得到了错误:错误C2248'Poco::Net::HTTPClientSession::operator=':无法访问在类'Poco::Net::HTTPClientSession'中声明的私有成员,这意味着此库不支持此功能,并且您必须始终使用唯一的ptr。我会更新我的答案。