2016-02-17 4 views
-1

Это мой класс:Почему конструктор вызывается после статического литья?

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. У вас есть идея, почему это происходит?

Edit:

this->_components вектор. Он объявлен в конструкторе следующим образом:

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

что тип 'component'? –

+0

Пожалуйста, покажите нам, как объявляется 'component'. –

ответ

5
  1. Вам нужно будет конвертировать component в ссылочный тип - AComponent& (или &component к AComponent*). Вы ничего не хотите копировать.
  2. Возможно, вам понадобится dynamic_cast для перехода от базового класса к производному классу безопасно. static_cast предназначен для downcasting без проверки, upcasting и ... ну, here's the list.

То, что вы должны были:

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

Узнайте, как использовать dynamic_cast. Есть проверка времени выполнения. Преобразование может завершиться неудачей и сбросить std::bad_cast (ссылочный тип) или вернуть nullptr (тип указателя).

Edit: Если у вас есть абстрактный IComponent и только один тип, производный от IComponent, вы можете быть уверены, там будет component будет ссылаться на AComponent объекта. Поэтому вы можете сделать это с помощью static_cast, но 1-й пункт все еще сохраняется.

+1

Не обязательно выполнять 'dynamic_cast'. 'static_cast' также исправляет downcasting, он просто не проверяет, что тип объекта и целевой тип имеют какое-то совпадение времени выполнения ...так что вы можете бросить что-то, чего нет у вашего объекта. Но, к примеру, довольно часто приходится реализовывать 'polymorphic_downcast' в терминах' static_cast', причем 'dynamic_cast' происходит только во время отладочных прогонов для проверки достоверности. –

2

1) Если временный объект типа new_type могут быть объявлены и инициализирован с выражением, так как по new_type Temp(expression);, которого может включать в себя неявные преобразования, вызов конструктора new_typeили его вызов пользовательскому оператору преобразования, затем static_cast<type>(expression) вычисляет и возвращает значение этого временного объекта.

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

Смежные вопросы