我想在我的代码中使用一个已经实现的抽象类(在我提供的简单代码中可以被视为“ A”)。 我定义了“ B”类来实现这些纯虚方法。事实是,该类的对象那时是不可复制的,因为operator =在抽象类中被删除了。 我有类“ 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")))
{}
答案 0 :(得分:2)
要进行以上编译:
添加标题:
#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?