为什么在静态转换后调用构造函数?

时间:2016-02-17 22:19:32

标签: c++ polymorphism dynamic-cast static-cast

这是我的班级:

class AComponent : public nts::IComponent
{
public:
  AComponent(const size_t &maxInputs, const size_t &maxOutputs, const size_t &value);
  AComponent(nts::AComponent &);
  virtual ~AComponent();
  virtual nts::Tristate Compute(size_t pin_num_this = 1);
  virtual void SetLink(size_t pin_num_this,
     nts::IComponent &component,
     size_t pin_num_target);
  void setComponent(const size_t &components, nts::Tristate &state);
  virtual void Dump(void) const;
  nts::Tristate &getComponent(const size_t &pin);
protected:
  std::vector <nts::Tristate *>   _components;
  size_t                        _maxInputs;
  size_t                        _maxOutputs;
};

当我尝试拨打这一行时:

this->_components[pin_num_this] =
    &static_cast<nts::AComponent>(component).getComponent(pin_num_target);

我发生了以下编译错误:

sources/AComponant.cpp:33:76: error: no matching function for call to ‘nts::AComponent::AComponent(nts::IComponent&)’
   this->_components[pin_num_this] = &static_cast<nts::AComponent>(component).getComponent(pin_num_target);

如果我实现构造函数,它就会在这里。问题是,我不想操纵IComponent,我想操纵AComponent。你知道为什么会这样吗?

编辑:

this->_components是一个向量。它以这种方式在构造函数中声明:

this->_components.reserve(maxInputs + maxOutputs + 2);

2 个答案:

答案 0 :(得分:5)

  1. 您需要将component转换为引用类型 - AComponent&(或&component转换为AComponent*)。你不想复制任何东西。
  2. 您可能需要dynamic_cast从基类向下转发到派生类安全static_cast用于向下转发而不进行检查,向上转发......嗯,here's the list
  3. 你应该拥有的东西:

    dynamic_cast<nts::AComponent&>(component).getComponent(pin_num_target);
    

    了解如何使用dynamic_cast。有一个运行时检查。转换可能会失败并抛出std::bad_cast(引用类型)或返回nullptr(指针类型)。

    修改:如果您有一个摘要IComponent且只有一种类型来自IComponent,那么您可以肯定会有component引用到AComponent个对象。因此,您可以使用static_cast执行此操作,但第一点仍然有效。

答案 1 :(得分:2)

  

1)如果可以声明new_type类型的临时对象   使用表达式初始化,如new_type Temp(expression);   可能涉及隐式转换,对构造函数的调用   然后,new_type 或调用用户定义的转换运算符   static_cast<type>(expression)计算并返回该值   临时对象。

http://en.cppreference.com/w/cpp/language/static_cast