所以我想出了他的代码,但我不确定如何继续使用删除功能? [关闭]

Posted

技术标签:

【中文标题】所以我想出了他的代码,但我不确定如何继续使用删除功能? [关闭]【英文标题】: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++ 新手,请原谅我的无知。但是程序不应该从数据库中删除整个索引吗?不能只是打印删除成功....? 您不能从数组中删除项目。您要么将插槽标记为已删除,要么将其下方的所有内容移至一个插槽并覆盖它。 【参考方案1】:

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

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

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 列表或向量。”单击尼克提供的链接并找出答案。对于初学者来说,它们比自己编写所有列表管理要容易得多。

以上是关于所以我想出了他的代码,但我不确定如何继续使用删除功能? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何作为方法的结果返回 DataSnapshot 值?

如何作为方法的结果返回 DataSnapshot 值?

如何作为方法的结果返回 DataSnapshot 值?

检查执行if语句的时间

为 NestJs REST API 创建 DTO、BO 和 DAO

使用请求通过 http 下载文件时的进度条