将Class对象存储在数组中

时间:2014-03-09 07:46:09

标签: c++ arrays class object

请查看以下内容:

dispenserType type[4];
dispenserType appleJuice();
type[0] = appleJuice;
dispenserType orangeJuice();
type[1] = orangeJuice;
dispenserType mangoLassi();
type[2] = mangoLassi;
dispenserType fruitPunch();
type[3] = fruitPunch;

如您所见,我在type数组中存储了不同的对象。

dispenserType类有一个构造函数,用于将项目数设置为20。 所以我们将对象int numberfItems的{​​{1}}设置为20,依此类推。

同一个类还有以下方法:将appleJuice减少一个的方法:

numberOfItems

例如,如果调用以下内容:

void dispenserType::makeSale()
{
    numberOfItems--;
}
int dispenserType::getNoOfItems() const
{
    return numberOfItems;
}

然后程序将显示正确的appleJuice.makeSales cout << appleJuice.getNoOfItems() << endl; ,即19。另一方面,如果调用numberOfItmes,则它将显示数字20.

这种行为让我认为cout<<type[0].getNoOfItems()appleJuice是两个独立的对象。

我的问题是,有没有办法创建一个对象数组而不需要声明一个对象并像我一样存储在数组中?

谢谢。

2 个答案:

答案 0 :(得分:1)

您没有存储任何对象,因为您没有创建任何对象。这是一个函数声明:

dispenserType appleJuice();

你需要

dispenserType appleJuice;

dispenserType appleJuice{}; // C++11

一旦你解决了这个问题,那么就是这样做

type[0] = appleJuice;

appleJuice的值分配给已存在的对象type[0]。这与说

相同
dispenserType a;
dispenserType b;

b = a;  // b and a are different objects
  

我的问题是,有没有办法创建一个对象数组而不需要声明一个对象并像我一样存储在数组中?

对于普通数组,唯一的方法是使用初始化列表,因为一旦初始化,您所能做的就是修改其现有元素。所以

dispenserType type[3] = { dispenserType(args), 
                          dispenserType(other args), 
                          dispenserType(other args) };

另一种方法是在其中构建std::vector<dispenserType>emplace_back元素。

答案 1 :(得分:0)

你是对的,type[0]appleJuice是两个不同的对象。

选项#1 - 您可以使用一组对象而无需克隆每个对象:

dispenserType type[4];

选项#2 - 您可以使用指针数组而不是对象数组:

dispenserType* type[4];
for (int i=0; i<sizeof(type)/sizeof(*type); i++)
    type[i] = new dispenserType();

当然,您必须在执行期间稍后删除每个已分配的对象:

for (int i=0; i<sizeof(type)/sizeof(*type); i++)
    delete type[i];