抽象类和唯一指针

新手上路,请多包涵

我的代码中有以下错误:

error: allocating an object of abstract class type 'Material'

我不知道如何处理这种情况。

我知道 std::make_unique 执行分配,所以它不能分配类型的对象 Material ,但我不知道如何纠正它。

 #include <iostream>
#include <memory>

struct Material
{
  Material() = default;
  virtual int get_color() const = 0;
};

struct Basic : public Material
{
  Basic() = default;
  virtual int get_color() const override
  {
    return 1;
  }
};

struct Mix : public Material
{
  Mix(const Material& mat1, const Material& mat2)
    : mat1_(std::make_unique<Material>(mat1))
    , mat2_(std::make_unique<Material>(mat2))
  {}

  virtual int get_color() const override
  {
    return mat1_->get_color() + mat2_->get_color();
  }
private:
  std::unique_ptr<Material> mat1_;
  std::unique_ptr<Material> mat2_;
};

int main()
{
  auto mix = Mix(Basic(), Basic());
  std::cout << mix.get_color() << '\n';
}

原文由 Colt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 817
1 个回答

这个电话:

 std::make_unique<Material>(mat1)

尝试创建类的实例 Material ,与 mat1 的类型无关。你似乎需要方法 clone() 在你的班级:

 class Material {
...
    virtual std::unique_ptr<Material> clone() const = 0;
};

那么 Mix ctor 将是:

 Mix(const Material& mat1, const Material& mat2)
    : mat1_(mat1.clone())
    , mat2_(mat2.clone())
  {}

并且您需要在每个派生类中实现 clone()

 struct Basic : public Material
{
  Basic() = default;

  virtual std::unique_ptr<Material> clone() const override
  {
      return std::make_unique<Basic>( *this );
  }

  virtual int get_color() const override
  {
    return 1;
  }
};

原文由 Slava 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题