For循环和对象命名

时间:2016-01-11 17:52:24

标签: c++

我正在制作一个for循环,它将从用户那里获得20个输入,然后我将输入存储在vector中。我想在for loop中将对象命名为20次。

现在我有这个:

vector<product*> productdetails;

for (int x = 1; x < 21; x++)
{
    Product*p1 = new product(0, "egrg", "rgdrg");
    cout << "Enter manufacturer for item #"<< x <<": ";
    p1->setmanufacturer();
    cout << "Enter name for item #" << x << ": ";
    p1->setname();
    cout << "Enter id for item #" << x << ": ";
    p1->setID();
    cout << endl;
    productdetails.push_back(p1);
}

如何将p1更改为p(x),以便每次循环结束/开始时,我都会有新的产品名称?与开始时一样,x将为1,我的第一个产品将为p1。当循环结束并且x ++时,x将变为2并且我将具有p2。

3 个答案:

答案 0 :(得分:2)

您的代码似乎很好。当您执行push_back时,会生成当前p1值的副本并将其放置在向量中。因此,在下一个循环迭代中为p1分配一个新值是完全安全的。

但是,如果你因某些(奇怪的)原因想在主循环中使用x,你可以在向量中预先分配20个元素,然后在循环中使用x来索引元素。

vector<product*> productdetails(20, nullptr);

for (int x = 0; x < 20; x++)
{
        productdetails[x] = new product(0, "egrg", "rgdrg");

        cout << "Enter manufacturer for item #"<< x <<": ";
        productdetails[x]->setmanufacturer();
        cout << "Enter name for item #" << x << ": ";
        productdetails[x]->setname();
        cout << "Enter id for item #" << x << ": ";
        productdetails[x]->setID();
        cout << endl;
}

另一个考虑因素是:

你真的需要指向产品吗?

为什么不将产品存储在这样的矢量中:

vector<product> productdetails;

for (int x = 0; x < 20; x++)
{
        productdetails.emplace_back(0, "egrg", "rgdrg");  // Constructs a new product
                                                          // at the back of vector


        cout << "Enter manufacturer for item #"<< x <<": ";
        productdetails[x].setmanufacturer();
        cout << "Enter name for item #" << x << ": ";
        productdetails[x].setname();
        cout << "Enter id for item #" << x << ": ";
        productdetails[x].setID();
        cout << endl;
}

然后你不需要在以后处理delete - 记忆。

答案 1 :(得分:0)

你的代码大部分都很好。没有理由担心命名变量p1p2p3等等。大概是您正在尝试这样做,因为您希望在以后的代码中访问产品4变量p4。但是,如果您的产品以保证顺序添加到向量中,您将始终能够通过访问productdetails向量中的第4个索引来访问产品4。

const size_t MAX_PRODUCTS = 20;

vector<product*> productdetails(MAX_PRODUCTS);

// product ids start from zero since vector indexes start at zero
for (size_t iii = 0; iii < MAX_PRODUCTS; ++iii)
{
    productdetails[iii] = new product(iii, "egrg", "rgdrg");
    cout << "Enter manufacturer for item #"<< iii <<": ";
    productdetails[iii]->setmanufacturer();
    cout << "Enter name for item #" << iii << ": ";
    productdetails[iii]->setname();
    // id is always the same as iii
    cout << endl;
}

// do something with product number 4
productdetails[4]->do_something();

答案 2 :(得分:-3)

我认为您不能在运行时使用C / C ++添加变量名称,而且我不太明白您想要做什么,以下代码是否有帮助?

vector<product*> productdetails(21+1);

for (int x = 1; x < 21; x++)
{
        productdetails[x] = new product(0, "egrg", "rgdrg");
        Product*p1 = productdetails[x];
        cout << "Enter manufacturer for item #"<< x <<": ";
        p1->setmanufacturer();
        cout << "Enter name for item #" << x << ": ";
        p1->setname();
        cout << "Enter id for item #" << x << ": ";
        p1->setID();
        cout << endl;
        productdetails.push_back(p1);
}