共享指向vector的指针返回包含std分配器

时间:2018-04-28 09:53:37

标签: c++ boost shared-ptr

我只是将带有终点向量的共享指针的类作为私有,

class HTTPService_resolve
{
public:
    HTTPService_resolve();
    HTTPService_resolve(std::string);
    boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> resolve_func();

    boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> resolve_func(std::string);
    boost::asio::io_service& get_service_reference();
    boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> get_vec_endpoints_ptr();

private:
    boost::asio::io_service service_resolve_ios;
    std::string service_resolve_protocol_host_URL;
    std::string host_name;
    std::string port_service;
    boost::asio::ip::tcp::resolver protocol_host_URL_resolver{ service_resolve_ios };
    boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> vec_endpoints_ptr = boost::make_shared<std::vector<boost::asio::ip::tcp::endpoint>>();//(new HTTPResponse);  
};

然后我创建了方法来获取返回共享指针的共享指针

boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> HTTPService_resolve::get_vec_endpoints_ptr()
{
    return vec_endpoints_ptr;
}

在其他类的构造函数中,声明将参数作为向量的共享指针传递给前一个方法。

HTTPClient::HTTPClient(const symbols_enum symbol = symbols_enum::EURUSD, date day = date(2012, Jan, 10), boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> client_vec_endpoints_ptr) :
    symbol(symbol),
    day(day),
    client_vec_endpoints_ptr(client_vec_endpoints_ptr)
{

}

但intellisense告诉我,论证是不同的 参数是端点向量和std分配器的共享指针,
由于std分配器部分,它给出了错误 我不知道为什么矢量改为采用std分配器部分,我甚至不知道什么是std分配器,从未使用过它。

这是显示其方法和成员的客户端类:

class HTTPClient
{
    friend class HTTPService_resolve;

public:
    /*
    // set up the worker threads in a thread group
    22 boost::thread_group workers;
    23 for (int i = 0; i < 3; ++i) {
    24 workers.create_thread([&service, &mtx]() {
    25 PRINT_ARGS("Starting worker thread ");
    26 service.run();
    27 PRINT_ARGS("Worker thread done");
    28 });
    29 }

    */
    HTTPClient(const symbols_enum, date);
    HTTPClient(const symbols_enum, date, boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>>);

    boost::asio::io_service& HTTPClient::get_service_reference();

    boost::shared_ptr<HTTPRequest> create_request(unsigned int);
    boost::shared_ptr<HTTPRequest> create_request(unsigned int, std::string);
    //void create_tasks(const symbols_enum&, date);
    void create_tasks(const symbols_enum , date);
    void fetch_day();
    void close();
private:
    //boost::asio::io_service m_ios;//HTTPService_resolve>>1
    boost::asio::io_service m_ios;
    std::unique_ptr<boost::asio::io_service::work> m_work;
    std::unique_ptr<boost::thread> m_thread;
    symbols_enum symbol = symbols_enum::EURUSD;
    date day = date(2012, Jan, 10);
    boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> client_vec_endpoints_ptr;

};

1 个答案:

答案 0 :(得分:0)

  

但intellisense告诉我,论证是不同的。   参数是端点向量和std分配器的共享指针,   并且由于std allocator部分,它给出了错误。   我不知道为什么向量改为采用std分配器部分,我甚至不知道什么是std分配器,从未使用过它。

这不是问题。 std::vector<T>始终等同于std::vector<T, std::allocator<T> >(因为默认模板参数:http://en.cppreference.com/w/cpp/container/vector

这不是问题:

<强> Live On Coliru

#include <memory>
#include <vector>
#include <boost/asio.hpp>

enum class Symbol { EURUSD };
using Date            = boost::gregorian::date;

using Endpoint        = boost::asio::ip::tcp::endpoint;
using Endpoints       = std::vector<Endpoint>;

using SharedEndpoint  = std::shared_ptr<Endpoint>;
using SharedEndpoints = std::shared_ptr<Endpoints>;

struct HTTPService {
    SharedEndpoints get_endpoints() const { return _endpoints; }
  private:
    SharedEndpoints _endpoints = std::make_shared<Endpoints>();
};

struct HTTPClient {
    HTTPClient(Symbol sym, Date date, SharedEndpoints endpoints) : _sym(sym), _date(date), _endpoints(endpoints) {}

  private:
    Symbol          _sym;
    Date            _date;
    SharedEndpoints _endpoints;
};

int main() {
    HTTPService svc;
    HTTPClient client1(Symbol::EURUSD, Date(2012, 1, 1), svc.get_endpoints());
    HTTPClient client2(Symbol::EURUSD, Date(2012, 1, 2), svc.get_endpoints());
}

加成

您似乎只希望客户端拥有一个端点(在此猜测)。认识别名构造函数:http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

<强> Live On Coliru

#include <memory>
#include <vector>
#include <boost/asio.hpp>

enum class Symbol { EURUSD };
using Date            = boost::gregorian::date;

using Endpoint        = boost::asio::ip::tcp::endpoint;
using Endpoints       = std::vector<Endpoint>;

using SharedEndpoint  = std::shared_ptr<Endpoint>;
using SharedEndpoints = std::shared_ptr<Endpoints>;

struct HTTPService {
    SharedEndpoints get_endpoints() const { return _endpoints; }
  private:
    SharedEndpoints _endpoints = std::make_shared<Endpoints>();
};

struct HTTPClient {
    HTTPClient(Symbol sym, Date date, SharedEndpoint endpoint) : _sym(sym), _date(date), _endpoint(endpoint) {}

  private:
    Symbol         _sym;
    Date           _date;
    SharedEndpoint _endpoint;
};

int main() {
    HTTPService svc;

    std::vector<HTTPClient> clients;
    auto shared_endpoints = svc.get_endpoints();
    for(auto ep : *shared_endpoints) {
        // alias a shared endpoint pointer to the lifetime of the endpoint vector
        SharedEndpoint sep(shared_endpoints, &ep);

        clients.emplace_back(Symbol::EURUSD, Date(2012, 1, 1), sep);
    }
}