我想了解C ++自动创建多个不确定数量的对象(0..n)的方法。用例如下:
假设我有一个脚本,用户必须输入相关数据(宽度,长度,高度),稍后Box类将包含这些数据。
Box
{
...
...
double width;
double length;
double height;
...
...
}
脚本如下:
<id="width" value="1"/>
<id="length" value="3"/>
<id="height" value="3"/>
<id="width2" value="3"/>
<id="length2" value="3"/>
<id="height2" value="4"/>
<id="width3" value="2"/>
<id="length3" value="3"/>
<id="height3" value="3"/>
换句话说,如何预先知道那些对象的数量是不知道的,而不是取决于用户输入了多少个盒子信息(宽度等)。
此外,是否有任何设计模式?
答案 0 :(得分:4)
答案 1 :(得分:2)
在运行时,您无法基于XML向您的类添加新成员。你能做的最好的就是你班上的std::map
,它会将id映射到值。像
class Box
{
std::map<std::string, int> values;
...
然后例如在Box构造函数中
values["width"] = 1;
values["width2] = 3;
显然,您可以从XML读取值并添加它们,而不是硬编码。
答案 2 :(得分:1)
假设您希望n
个对象输入Box
Box **array = new Box*[n];
for(int i = 0; i < n; i += 1) {
array[i] = new Box();
}
更新#1
如果你想要一个可变长度列表,你可以尝试:
答案 3 :(得分:1)
显而易见的是,首先你需要解析xml文件。所有其他答案假设您已经知道如何做到这一点。在这里,我将补充QuinnFTW的答案,并为您提供Parsing xml with Boost的链接。为什么?好吧,如果您知道如何从xml获取对象列表,那么您就不会问这个问题了。
并补充QuinnFTW使用std::vector回答代码示例。
#include <vector>
#include <iostream>
using namespace std;
struct Box {
double with, length, height;
Box():with(0), length(0), height(0) {}
};
typedef std::vector<Box> box_list_t;
int main()
{
Box a, b, c;
// Create the vector.
box_list_t box_list;
box_list.push_back(a); // Add a to the vector;
box_list.push_back(b); // Add b to the vector;
box_list.push_back(c); // Add c to the vector;
box_list[0].with = 0; // Change the with of a to 0;
cout << box_list[1].with << endl; // Prints b.with. Have not been initialized.
return 0;
}