Как я могу переместить объекты из контейнера конкретных типов объектов в контейнер интерфейсов? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть несколько вопросов относительно простого кода, который я использую для решения проблемы.

Я работаю с фрагментом кода здесь, где я не могу найти чистый C ++ API для выполнения следующие операции:

// Example program
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

class Interface {
public:
    virtual auto get() -> uint32_t = 0;
    virtual auto set(uint32_t) -> void = 0;
    virtual ~Interface(){std::cout<<"Interface Destory called\n";}
};

class Class : public Interface {
private:
    uint32_t m_data;
public:
    Class(uint32_t);
    ~Class();
    virtual auto get() -> uint32_t override;
    virtual auto set(uint32_t) -> void override;
};

Class::Class(uint32_t data) : m_data(data) {std::cout<<"Class Create called\n";}
Class::~Class(){std::cout<<"Class Destory called\n";};
auto Class::get() -> uint32_t {
    return m_data;
}
auto Class::set(uint32_t data) -> void {
    m_data = data;
}

class ClassManager {
private:
    std::vector<std::shared_ptr<Interface>> vec;
public:
    ClassManager();
    ~ClassManager();
    virtual auto get() -> std::vector<std::shared_ptr<Interface>>;
    virtual auto set(std::vector<std::shared_ptr<Interface>>) -> void; 
};

ClassManager::ClassManager(){std::cout<<"ClassManager Create called\n";}
ClassManager::~ClassManager(){std::cout<<"ClassManager Destory called\n";}
auto ClassManager::get() -> std::vector<std::shared_ptr<Interface>> {
    return vec; 
}
auto ClassManager::set(std::vector<std::shared_ptr<Interface>> data) -> void {
    vec = std::copy(data); //  Question 3/3: Can I simply copy the memory?
}

int main()
{
    Class f(1);
    Interface &i = f;

    std::cout<< "From Class: " << f.get() << "\n";
    std::cout<< "From Interface: " << i.get() << "\n";

    std::vector<Class> vc = {1, 2, 3, 4, 5, 6, 7};
    std::for_each(std::begin(vc), std::end(vc), [](auto &x){std::cout<<x.get()<<" ";}); // works good till this point

    std::vector<std::shared_ptr<Interface>> vi = vc; // Question 1/3: what is the best way to convert a container of concrete-type to a container of abstract-type ?

    ClassManager cm;
    cm.set(vi);

    auto vir = cm.get();
    std::vector<Class> vcr = vir; // Question 2/3: How can I move/copy the container of abstract-type to container of concrete-type?
    std::for_each(std::begin(vcr), std::end(vcr), [](auto &x){std::cout<<x.get()<<" ";});

    return 0;
}
  1. У меня есть вектор объектов класса, который я хочу передать в класс ClassManager как вектор указателей интерфейса. На данный момент я действительно не знаю, как преобразовать эти конкретные объекты в указатели интерфейса. Каким будет самый чистый способ сделать эти преобразования? ClassManager должен работать только с указателями абстрактного типа.

  2. И затем я просто хочу сделать противоположное пункту 1, который преобразует вектор указателей интерфейса в вектор конкретных объектов класса.

  3. При выделении памяти вектору-члену указателей интерфейса в методе Get ClassManager могу ли я выделить память и скопировать элементы в один go?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...