2014-10-01 3 views
-1

Я пытаюсь передать объект абстрактного класса как по ссылке, но он явно дает ошибку, когда я пытаюсь сохранить эти объекты в массиве указателей с тем же типом данных. Может кто-нибудь объяснить, что я делаю неправильно? Это в следующей функции:C++ хранение абстрактного объекта в массиве

void enterItem(DessertItem& item) 
    { 
     if (top != (maxSize-1)) 
     { 
      arr[top] = &item; 
      top++; 
     } 
    } 

dessertItem класс фактически является абстрактным классом и «аранжировка» представляет собой указатель массива dessertItem так что он может дать ссылку на любой новый объект всякий раз, когда он получает передается по ссылке. Я не могу понять, как я должен это делать? Вот класс:

class Checkout 

    { 

     ////Maintains a list of DessertItem references. 
     protected: 

     int maxSize; 

     int top; 

     DessertItem **arr; 


    public: 

    Checkout() 

    { 

    ///Creates a Checkout instance with an empty list of DessertItem's 


     this->maxSize=5; 
     this->top=0; 
     this->arr = new DessertItem*[maxSize]; 
     for(int i=0; i<maxSize; i++) 
     { 
      arr[i]=NULL; 
     } 
    } 


    ////Clears the Checkout to begin checking out a new set of items 
    void clear() 

    { 

     for(int i=0; i<maxSize; i++) 
     { 
      arr[i]=NULL; 
     } 
    } 


    //A DessertItem is added to the end of the list of items 

    void enterItem(DessertItem &item) 

    { 

     if(top!=(maxSize-1)) 


     { 
      arr[top]=&item; 
      top++; 
     } 
    } 


    //Returns the number of DessertItem's in the list 


    int numberOfItems() 

    { 

     return this->top; 
    } 

    }; 
+0

Пожалуйста, покажите нам сообщение об ошибке вы видите. – jweyrich

+0

В нем говорится, что ожидается спецификатор типа. Что это значит на самом деле? –

+0

где указано arr и верх? –

ответ

1

магазин ваши абстрактные объекты в vector<unique_ptr<T>>. когда вы их строить, строить их как unique_ptr, например:

class Base { 
public: 
    virtual ~Base() = default; 
    virtual void method() = 0; 
}; 

class Impl : public Base { 
public: 
    void method() override { /* perform action here */ }; 
}; 

создавать и хранить так:

// nasty old c-style array 
std::unique_ptr<Base> a[10]; 
a[0] = std::move(std::unique_ptr<Base>(new Impl)); 

// std::vector 
std::unique_ptr<Base> p { new Impl }; 
std::vector<std::unique_ptr<Base>> v; 

v.push_back(std::move(p)); 
// or 
v.emplace_back(new Impl); 
+0

Я еще не работал с векторами, потому что я просто новичок. Есть ли способ, чтобы я мог сортировать его без использования векторов? –

+0

обновленный ответ, чтобы продемонстрировать использование массива c-style unique_ptr

+2

@Brainy_ самым важным правилом в отношении классов C++, таких как std :: vector, является то, что он более сложный, чтобы испортить их, чем неприятные старые массивы C-стиля. Абсолютно нет причин избегать их только потому, что вы учитесь. – o11c

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