【问题标题】:how to initialize a non copyable object data member如何初始化不可复制的对象数据成员
【发布时间】:2019-08-25 06:03:05
【问题描述】:

我想在我的代码中使用一个已经实现的抽象类(在我提供的简单代码中可以看作是“A”)。 我定义了类“B”来实现那些纯虚方法。这里的事实是,这个类的对象不能被复制,因为 operator= 在抽象类中被删除了。 我有类“Z”,它有一个“B”类对象的数据成员。正如您在代码中看到的那样,我想初始化对象。但由于它是不可复制的,因此肯定会显示错误,例如 use of deleted function ‘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")))
{}

【问题讨论】:

  • 可能只是缺少包含,但我收到大量与您的问题无关的错误:wandbox.org/permlink/umVfs33yaFnIaLON
  • 你知道class A : B 是私有继承,对吧?对于继承接口私有继承意义不大...
  • user463035818 抱歉,我忘了复制包含。现在我编辑了。而且它应该用c++11编译。我还更正了公共继承,尽管它不影响问题。
  • 你可以初始化你的对象。你不能使用 std::make_shared。

标签: c++ object-initializers


【解决方案1】:

使上面的编译:

添加标题:

#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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多