将对象存储在数组中

时间:2017-04-05 02:04:39

标签: arrays c++11 object

我是一名CS一年级学生,我们最近有一项任务,介绍我们创建自己的类,构造函数和对象。它要求我们通过以下FOR循环并使用用户定义的类planet的不同对象来调用每个用户定义的函数。

///put each Obj into an Obj[ ] ----> p[MercuryObj, VenusObj, etc...]
///object objectArray[]
///class_of_object objectArray[]???

for(int i = 0; i < 4; i++){
    cout << "The orbit of " << p[i].getName();
    cout << " takes " << p[i].getOrbitPeriod() << " years." << endl;
    cout << "The diameter of " << p[i].getName();
    cout << " is " << p[i].getDiameter() << " km." << endl
    }

我以为我可以创建一个数组(我们还没有使用向量)来保存每个对象,然后可以在FOR循环中迭代,就像int / float / string / etc类型的数组一样。 ..但它没有用 planet p[] = {MercuryObj, VenusObj, EarthObj, MarsObj};

相反,我最终只是手动将对象放入数组中,就像这样

planet p[4];
p[0] = MercuryObj;
p[1] = VenusObj;
...
...

有人向我展示了一个不同的解决方案:

///each value is {planets name, planet's orbit, planet's diameter}
///planet's name is a string, planet's orbit & diameter are both floats  
planet p[4] = {{"Mercury", 2440, 0.387},{"Venus", 6052, 0.723},{"Earth", 6371, 1.000},{"Mars", 3390, 1.524}};    

但我不明白.getName().getOrbitPeriod().getDiameter()如何区分相应.get...()的每个值?

2 个答案:

答案 0 :(得分:0)

基于“我不明白.getName(),. getOrbitPeriod()和.getDiameter()如何能够区分适当的.get ...()的每个值?”以下内容:

planet p[4] = {{"Mercury", 2440, 0.387},{"Venus", 6052, 0.723},{"Earth", 6371, 1.000},{"Mars", 3390, 1.524}};    

您的问题似乎会转化为以下内容: “列表初始化数组如何知道如何使用嵌套列表初始化构造其组成对象?”

http://en.cppreference.com/w/c/language/array_initializationhttp://en.cppreference.com/w/cpp/language/list_initialization

基本上,编译器知道数组将包含的对象的类型。当你将数组本身声明为

时,这种知识就会被充实
planet p[4] = //...

因此,当它看到每个嵌套的大括号列表时,它会将它们看作是一个初始化列表转到该类型的对象,并相应地构造该对象。因为数组具有暴露“getName()”和“getOrbitPeriod()”等类型的对象,所以可以在每个相应的对象上调用它们。数组中的每个相应对象都维护自己的数据,与初始化时的数据一致。所以,并不是它区分每个值,当你访问p [0]时(例如),当你调用p [0] .getName()时,你在THAT对象上调用它,它维护自己的数据

答案 1 :(得分:0)

如果这是关于C ++,尤其是C ++ 11,你应该考虑使用std :: array:

std::array<planet, 4> p;

您可以将它与初始化列表组合在一起,您可以非常优雅地循环这些,如下所示:

for(auto &currentPlanet : p)
{
  // ... Do something
}

您使用的阵列来自普通的旧C标准,而不是那个方便的恕我直言。

关于初始化列表,它取决于如何声明类中成员变量的顺序。如果你想控制那个列表,你也可以重载初始化列表或使用不同的构造函数,但我的猜测是,你真的不想这样做。