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