C++ 如何初始化不可复制的对象数据成员

C++ 如何初始化不可复制的对象数据成员,c++,object-initializers,C++,Object Initializers,我想在我的代码中使用一个已经实现的抽象类(在我提供的简单代码中可以看作是“A”)。 我定义了类“B”来实现这些纯虚拟方法。这里的事实是,这个类的对象不能被复制,因为操作符=在抽象类中被删除。 我有一个类“Z”,它有一个“B”类对象的数据成员。我想初始化你在代码中看到的对象。但由于它是不可复制的,因此肯定会显示错误,如使用已删除的函数“NS::B::B(NS::B&&)”。我不知道如何将这个对象作为数据成员,并用正确的数据初始化它。 代码的简单版本如下所示: #include <string

我想在我的代码中使用一个已经实现的抽象类(在我提供的简单代码中可以看作是“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")))
{}

#包括
#包括
#包括
名称空间NS{
类//抽象类
{
公众:
A()=默认值;
A&运算符=(常量A&其他)=删除;
A(常数A和其他)=删除;
};
}
名称空间NS{
B类:公共A
{
公众:
B(INTP);
};
}
名称空间SI{
Z类
{
公众:
Z(int p,std::string name);
私人:
NS::bobj3;
};
typedef std::shared_ptr ZPtr;
}
SI::Z::Z(int p,std::string name):obj3(p)
{}
名称空间SI{
Y类
{
公众:
Y(int-p);
私人:
SI::ZPtr-obj2;
};
}
SI::Y::Y(intp):obj2(std::make_shared(SI::Z(p,“hi”))
{}

要编译上述内容:

添加标题:

#include <string>
#include <memory>
您的主要问题在于创建共享对象

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

请提供一个可能刚刚丢失的include,但我得到了大量与您的问题无关的错误:您知道
class a:B
是私有继承,对吗?因为继承接口私有继承没有多大意义…user463035818对不起,我忘了复制includes。现在我编辑了它。它也应该用c++11复制。我还纠正了公共继承,尽管它在这个问题上不受影响。你可以初始化你的对象。您不能使用std::make_shared。
 obj2(std::make_shared<SI::Z>(SI::Z(p,"hi")))
 obj2(std::make_shared<SI::Z>(p, "hi"))     // Notice the diff?