общий указатель на вектор, возвращающий другой общий указатель, содержащий распределитель std - PullRequest
0 голосов
/ 28 апреля 2018

я просто сделал класс с общим указателем на вектор конечной точки как приватный,

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 голосов
/ 29 апреля 2018

но intellisense говорит мне, что аргумент другой. аргумент является общим указателем на вектор конечной точки и распределителя std, и из-за части распределителя std, это дает ошибку. я не знаю, почему вектор изменился на один, принимающий участие в распределении 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());
}

Бонус

Кажется вероятным, что вы хотите, чтобы клиент содержал только одну конечную точку (догадываясь здесь). Познакомьтесь с конструктором aliasing : 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);
    }
}
...