【问题标题】:So i've come up with his code and i'm not sure how to continue with the delete function? [closed]所以我想出了他的代码,但我不确定如何继续使用删除功能? [关闭]
【发布时间】:2018-04-12 17:45:50
【问题描述】:

我必须使用用户输入的 id 从数据库中删除饮料.. 那么我应该如何继续?我不知道在 if 条件里面写什么?

class Drink{
private:
float cost;
char product_id[10];
char dname[30];
int numDrink;
public:    
void addDrink(char drinkname[],float price,char id[]); 
void delDrink(char drinkname[],char id[]);
//void updateItem();
//void searchItem();
};
Drink drinkBase[100];
void Drink::addDrink(char drinkname[],float price,char id[])
{

 strcpy(drinkBase[numDrink].dname,drinkname);
 strcpy(drinkBase[numDrink].product_id,id);
 drinkBase[numDrink].cost = price;
 cout<<"\nItem inserted successfully!"<<endl;
 numDrink++;
 }
 void Drink::delDrink(char drinkname[],char id[])
 {
 int i;
 for(int i=0;i<numDrink;i++){
    if((strcmp(drinkname,drinkBase[i].dname)==0)&& 
 (drinkBase[i].product_id=id))
    {

        cout<<"\nItem deleted successfully";
        return;
    }
 }

 }

【问题讨论】:

  • “我应该如何继续”是什么意思?我看不出有什么需要继续的。为什么需要在if条件中多写?
  • 例如你现在可以写一些单元测试。
  • 我是 C++ 新手,请原谅我的无知。但是程序不应该从数据库中删除整个索引吗?不能只是打印删除成功....?
  • 您不能从数组中删除项目。您要么将插槽标记为已删除,要么将其下方的所有内容移至一个插槽并覆盖它。

标签: c++ arrays class


【解决方案1】:

由于您的数组大小是固定的,您可以使用空名称和/或 id 将其“标记”为已删除。但随后您遇到了通过numDrink 跟踪“最后”饮料的问题。

您可以使其动态调整大小,但实际上您应该使用 STL listvector。这样你就可以这样做:

for (auto it = drinks.begin(); it != drinks.end(); ++it) {
  if ((strcmp(drinkname,(*it).dname) == 0) && ((*it).product_id = id)) {
    drinks.erase(it);
    break;
  }
}

但要小心迭代器和循环。上面的代码适用于一次删除一个项目。如果您不熟悉,我建议您阅读iterators

【讨论】:

  • 谢谢。但我不知道什么是 STL 列表或向量。我正在寻找一些基本的东西,对于初学者..?您能否澄清一下我将如何使用空名称将其标记为已删除?
  • @LoneRanger “但我不知道什么是 STL 列表或向量。”单击尼克提供的链接并找出答案。对于初学者来说,它们比自己编写所有列表管理要容易得多。
猜你喜欢
  • 2021-09-10
  • 2011-01-20
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多