2016-03-28 3 views
-1

Я новичок в C++, и я не знаю, как иметь дело с возвращаемым типом этого:с ++, возвращающие константную ссылку объекта

const Derived& myClass::getDerived(){} const.

MyClass имеет переменную-член Base**b:

#include "Base.h" 
Class myClass 
{ 
    public: 
     virtual const Derived& getDerived() const; 
    ..... 
    protected: 
     Base**b; 
} 

производный класс наследуется от базового класса:

Class Derived : public Base 
{ 
    .... 
} 

Я пробовал: return b[indexOfDerived]; и ошибка: reference to type 'const Derived' could not bind to an lvalue of type 'Base *'

Я также попытался : return *this->b[indexOfDerived]; и погрешность: no viable conversion from returned value of type 'Part' to function return type 'const CPU'

Как вернуть ссылку на const для объекта? Я весьма озадачен.

Я инициализируется в конструкторе переменную Base**b следующим кодом:

myClass::myClass() 
{ 
    b = new Base*[size]; 
    for(int i = 0; i < size; i++) 
    { 
      b[i] = new Base(); 
    } 
} 
.... 
// deallocating memory in destructor by using delete and delete[] 
.... 

Извините за плохой синтаксис.

ответ

2

С учетом вашей инициализации это невозможно. A const Derived& может относиться только к объекту типа Derived или к классу, производному от Derived.

Но вы создавали объекты типа Base. У вас нет объектов типа Derived.

Вы могли бы попытаться это, написав:

virtual const Derived& getDerived() const 
{ 
    return dynamic_cast<Derived const &>(*b[indexOfDerived]); 
} 

который будет сгенерировано исключение, если указатель на вопрос фактически не указывают на Derived. (Который он не будет, пока у вас не будет new Derived).

+0

Я на самом деле работает спасибо! Я только начинаю изучать C++, и я раньше не видел «dynamic_cast <>» или «static_cast <>». Я понимаю, что кастинг в java и c, но еще не введен для кастинга на C++, есть ли у вас какая-либо рекомендуемая статья или ссылки, которые вводят кастинг в C++? СПАСИБО! –

0

Во-первых, если вы хотите вернуть Derived, то вы должны создать Derived

b[i] = new Base(); 

Вы должны бросить, чтобы преобразовать Base* в Derived*

const Derived& getDerived() const 
{ 
    return *static_cast<Derived const*>(b[0]); 
} 

Рассмотрим с помощью vector<Base*> или лучше vector<unique_ptr<Base>> к помощь в управлении памятью и проблемах безопасности исключений.

+0

Спасибо за ответ! Я начинаю изучать кастинг в C++, есть ли у вас какие-либо рекомендуемые ссылки или статья, представляющая эту тему? –

+0

Возможно, это поможет вам: [Тип конверсии] (http://www.cplusplus.com/doc/tutorial/typecasting/) – Thomas

+0

Большое спасибо! –

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