2016-09-01 2 views
-2

Как-то после определения AbstractClass я не могу получить производный класс, возвращающий объект производного класса. В чем проблема с следующим кодом?Аннотация Наследование классов

Спасибо.

Код:

#include <iostream> 
using namespace std; 
template <typename T> 
class AbstractClass { 
    public: 
     virtual AbstractClass<T> operator[](int index) = 0; 
} ; 
template <typename T> 
class ClassA : public AbstractClass<T> { 
    public: 
     ClassA<T> operator[](int index){ 
      ClassA<T> A; 
      return A; 
     } 
} ; 
template <typename T> 
class ClassB : public ClassA<T> { 
    public: 
     ClassA<T> operator[](int index){ 
      ClassA<T> A; 
      return A; 
     } 
} ; 
int main(void){ 
    ClassA<int> A; 
    A[0][1][2]; 
} 

Ошибка:

test2.cpp(11): error: return type is neither identical to nor covariant with return type "AbstractClass<int>" of overridden virtual function "AbstractClass<T>::operator[] [with T=int]" 
      ClassA<T> operator[](int index){ 

Изменение эталону дает предупреждение о возврате локальной переменной:

#include <iostream> 
using namespace std; 
template <typename T> 
class AbstractClass { 
    public: 
     virtual AbstractClass<T>& operator[](int index) = 0; 
} ; 
template <typename T> 
class ClassA : public AbstractClass<T> { 
    public: 
     ClassA<T>& operator[](int index){ 
      ClassA<T> A; 
      return A; 
     } 
} ; 
template <typename T> 
class ClassB : public ClassA<T> { 
    public: 
     ClassA<T>& operator[](int index){ 
      ClassA<T> A; 
      return A; 
     } 
} ; 
int main(void){ 
    ClassA<int> A; 
    A[0][1][2]; 
} 

Предупреждение

test2.cpp(13): warning #879: returning reference to local variable 
       return A; 
        ^
      detected during instantiation of "ClassA<T> &ClassA<T>::operator[](int) [with T=int]" at line 26 

И я не знаю, как вернуть новый объект, если я вернусь по ссылке.

Некоторые люди предложили мне реализовать конструктор перемещения. Но, я обнаружил, что конструктор перемещения и шаблон не работают вместе: Move operator with templates

Есть ли решение?

+0

, прежде чем вниз голосования. скажите, что не так в коде/вопросе. Я попытаюсь исправить. – rxu

+2

Что неясно о сообщении об ошибке на самом деле? –

+0

Почему метод класса A не может вернуть класс A, несмотря на то, что абстрактный класс говорит, что метод может возвращать абстрактный класс, а класс A получен из абстрактного класса? Или каково решение, чтобы методы classA и classB возвращали classA? – rxu

ответ

1

Возврат AbstractClass<T> в качестве экземпляра (не ссылки или указателя) требует построения копии этого точного типа. Это невозможно для абстрактного класса.

Чтобы реализовать полиморфизм, выделите экземпляр соответствующего подкласса на голове и верните указатель или интеллектуальный указатель, например std::shared_ptr, набранный базовым классом.

+0

, что имеет смысл. – rxu

1

У вас есть две вещи неправильно здесь:

  1. Когда вы возвращающие Base как, например, для производных классов, вам нужен тот же тип Base чтобы быть построены.

  2. Когда вы пишете такие вещи, как ClassA A, вы не указываете аргументы шаблона. Это должно быть действительно:

    ClassA<T> A; 
    
+0

Я изменил это. проблема локальной переменной все еще существует, когда я пытаюсь вернуться по ссылке. Спасибо, что указали на эту ошибку. – rxu

+0

Вам нужен либо указатель, либо конструктор перемещения, поэтому для передачи права собственности –

+0

НЕ верните указатель или ссылку на локальную переменную в стеке! Это будет недействительным после возврата метода. Вам нужно выделить объект в куче и вернуть ему (умный) указатель. –

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