【问题标题】:shared_ptr from abstract class来自抽象类的 shared_ptr
【发布时间】:2018-02-09 14:27:48
【问题描述】:

我有这个中介模式:

文件actor.hpp

#pragma once
#include <memory>
#include "mediator.hpp"

class actor : std::shared_from_this<actor>
{
  public:

  actor(std::shared_ptr<mediator> mediator) : mediator_(mediator)
  {
  }

  virtual ~actor() = 0;

  virtual void changed()
  {
    mediator_->actor_changed(std::make_shared<actor>(this));
  }

  private:

  std::shared_ptr<mediator> mediator_;
};

文件mediator.hpp

#pragma once
#include <memory>

class actor;

class mediator : public std::shared_from_this<mediator>
{
  public:

  virtual ~mediator() = 0;

  virtual void actor_changed(std::shared_ptr<actor> actor) = 0;
}

演员request_handler.hpp的实现

#pragma once
#include "actor.hpp"

class request_handler : public actor
{
  public:

  request_handler(std::shared_ptr<mediator> mediator) : actor(mediator)
  {
  }

  void handle_request()
  {
    changed();
  }
};

但我收到错误消息

actor.hpp:16 error: invalid new-expression of abstract class type 'actor'

因为我不能实例化一个抽象类。但是这样做的正确方法是什么?

【问题讨论】:

  • shared_from_this;但除非您的来电者会保留对它的引用;你是在给自己挖洞,你最好只是传递一个指针
  • 你不应该做std::make_shared&lt;actor&gt;(this),而是使用shared_from_this成员函数。

标签: c++ shared-ptr mediator


【解决方案1】:

这段代码:

 mediator_->actor_changed(std::make_shared<actor>(this));

逻辑上等于:

auto ptr = std::shared_ptr<actor>( new actor( this ) );
mediator_->actor_changed(ptr);

这很可能不是您想要的,因此您需要致电 shared_from_this()

mediator_->actor_changed( this->shared_from_this() );

您需要继承的类称为std::enable_shared_from_this 而不是shared_from_this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多