C ++将抽象对象存储在数组中

时间:2014-10-01 23:46:17

标签: c++ oop

我一直试图通过引用传递抽象类的对象,但是当我尝试将这些对象存储在具有相同数据类型的指针数组中时,它显然会出错。任何人都可以解释我做错了什么? 它在以下功能中:

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

dessertItem类实际上是一个抽象类,“arr”是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;
    }

    };

1 个答案:

答案 0 :(得分: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);