У меня есть несколько вопросов относительно простого кода, который я использую для решения проблемы.
Я работаю с фрагментом кода здесь, где я не могу найти чистый 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;
}
У меня есть вектор объектов класса, который я хочу передать в класс ClassManager как вектор указателей интерфейса. На данный момент я действительно не знаю, как преобразовать эти конкретные объекты в указатели интерфейса. Каким будет самый чистый способ сделать эти преобразования? ClassManager должен работать только с указателями абстрактного типа.
И затем я просто хочу сделать противоположное пункту 1, который преобразует вектор указателей интерфейса в вектор конкретных объектов класса.
При выделении памяти вектору-члену указателей интерфейса в методе Get ClassManager могу ли я выделить память и скопировать элементы в один go?