这是我的班级:
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);
答案 0 :(得分:5)
component
转换为引用类型 - AComponent&
(或&component
转换为AComponent*
)。你不想复制任何东西。dynamic_cast
从基类向下转发到派生类安全。 static_cast
用于向下转发而不进行检查,向上转发......嗯,here's the list。你应该拥有的东西:
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)
计算并返回该值 临时对象。