我是一名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...()
的每个值?
答案 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_initialization 和http://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 ¤tPlanet : p)
{
// ... Do something
}
您使用的阵列来自普通的旧C标准,而不是那个方便的恕我直言。
关于初始化列表,它取决于如何声明类中成员变量的顺序。如果你想控制那个列表,你也可以重载初始化列表或使用不同的构造函数,但我的猜测是,你真的不想这样做。