为什么在静态转换后调用构造函数?
Why the constructor is called after a static cast?
这是我的 class:
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);
- 您需要将
component
转换为引用类型 - AComponent&
(或 &component
转换为 AComponent*
)。你不想复制任何东西。
- 您可能需要
dynamic_cast
才能从基础 class 向下转换为派生 class 安全地。 static_cast
用于不带检查的向下转型、向上转型和...好吧,here's the list。
你应该拥有的:
dynamic_cast<nts::AComponent&>(component).getComponent(pin_num_target);
阅读如何使用 dynamic_cast
。涉及运行时检查。转换可能会失败并抛出 std::bad_cast
(引用类型)或 return nullptr
(指针类型)。
编辑: 如果你有一个抽象 IComponent
并且只有一个类型派生自 IComponent
,你可以很确定会有一个 component
将引用一个 AComponent
对象。因此,您可以使用 static_cast
执行此操作,但第一点仍然成立。
1) If a temporary object of type new_type
can be declared and
initialized with expression, as by new_type Temp(expression);
, which
may involve implicit conversions, a call to the constructor of
new_type
or a call to a user-defined conversion operator, then
static_cast<type>(expression)
computes and returns the value of that
temporary object.
这是我的 class:
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);
- 您需要将
component
转换为引用类型 -AComponent&
(或&component
转换为AComponent*
)。你不想复制任何东西。 - 您可能需要
dynamic_cast
才能从基础 class 向下转换为派生 class 安全地。static_cast
用于不带检查的向下转型、向上转型和...好吧,here's the list。
你应该拥有的:
dynamic_cast<nts::AComponent&>(component).getComponent(pin_num_target);
阅读如何使用 dynamic_cast
。涉及运行时检查。转换可能会失败并抛出 std::bad_cast
(引用类型)或 return nullptr
(指针类型)。
编辑: 如果你有一个抽象 IComponent
并且只有一个类型派生自 IComponent
,你可以很确定会有一个 component
将引用一个 AComponent
对象。因此,您可以使用 static_cast
执行此操作,但第一点仍然成立。
1) If a temporary object of type
new_type
can be declared and initialized with expression, as bynew_type Temp(expression);
, which may involve implicit conversions, a call to the constructor ofnew_type
or a call to a user-defined conversion operator, thenstatic_cast<type>(expression)
computes and returns the value of that temporary object.