как инициализировать не копируемый элемент данных объекта - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу использовать в моем коде уже реализованный абстрактный класс (который можно увидеть как «A» в моем простом предоставленном коде).Я определил класс "B" для реализации этих чисто виртуальных методов.Дело в том, что объекты этого класса не могут быть копируемыми, так как оператор = удаляется в абстрактном классе.У меня есть класс "Z", который имеет член данных объекта класса "B".Я хочу инициализировать объект, как вы видите в коде.Но поскольку он не копируемый, он наверняка покажет ошибки, такие как использование удаленной функции 'NS :: B :: B (NS :: B &&)' .Я не знаю, как я должен иметь этот объект в качестве члена данных, а также инициализировать его с правильными данными.Простая версия кода выглядит следующим образом:

#include <string>
#include <iostream>
#include <memory>

namespace NS {
class A //abstract class
{
public:
    A() = default;
    A& operator=(const A& other) = delete;
    A(const A& other) = delete;
};
}

namespace NS {
class B : public A
{
public:
    B(int p);
};
}

namespace SI {
class Z
{
public:
    Z(int p, std::string name);
private:
    NS::B obj3;
};
typedef std::shared_ptr<SI::Z> ZPtr;
}

SI::Z::Z(int p, std::string name) : obj3(p)
{}

namespace SI {
class Y
{
public:
    Y(int p);
private:
    SI::ZPtr obj2;
};
}

SI::Y::Y(int p) : obj2(std::make_shared<SI::Z>(SI::Z(p,"hi")))
{}

1 Ответ

2 голосов
/ 03 апреля 2019

Чтобы сделать вышеупомянутую компиляцию:

Добавьте заголовки:

#include <string>
#include <memory>

Вы также должны иметь возможность создать A, поэтому вам нужно сделать конструкторы общедоступными:

class A //abstract class
{
    public:               // Added this:
         A() = default;
    .....
};

Ваша главная проблема заключается в создании общего объекта.

 obj2(std::make_shared<SI::Z>(SI::Z(p,"hi")))

Вам не нужно создавать здесь объект SI::Z (так как он не копируется, это проблема). Что вы хотите сделать, это передать аргументы, которые будут использоваться для создания SI::Z объекта. Затем std::make_shared() вызовет new и перенаправит эти параметры в конструктор.

 obj2(std::make_shared<SI::Z>(p, "hi"))     // Notice the diff?
...