2017-02-18 91 views
0
#include <bits/stdc++.h> 
using namespace std; 

class contact { 
private: 
    vector< pair<string, int> > contact_info; 
public: 
    void add_contact(string contact_name, int contact_number) { 
     contact_info.push_back(make_pair(contact_name, contact_number)); 
     sort(contact_info.begin(),contact_info.end()); 
    } 
    void edit_contact(string contact_name) { 
     int found_at; 
     for (unsigned int i =0; i < contact_info.size(); i++) { 
      if (contact_info[i].first == contact_name) { 
       found_at = i; 
      } 
    } 
    if (contact_info[found_at +1].first == contact_name) { 
     int choice; 
     int counter = found_at; 
     int index = 1; 
     while (contact_info[counter].first == contact_name) { 
      cout << index << ". " << contact_info[counter].first << " " << contact_info[counter].second; 
      counter++; 
      index++; 
     } 
     cout << "Choose any please: "; 
     cin >> choice; 
     found_at = found_at - (choice - 1); 
    } 
    cout << "Enter the new number: "; 
    cin >> contact_info[found_at].second; 
} 
void show_all() { 
    for (unsigned int i =0; i < contact_info.size(); i++) { 
     cout << contact_info[i].first << " " << contact_info[i].second << endl; 
    } 
} 
void delete_contact(string contact_name) { 
    int found_at; 
    for (unsigned int i =0; i < contact_info.size(); i++) { 
     if (contact_info[i].first == contact_name) { 
      found_at = i; 
     } 
    } 
    if (contact_info[found_at +1].first == contact_name) { 
     int choice; 
     int counter = found_at; 
     int index = 1; 
     while (contact_info[counter].first == contact_name) { 
      cout << index << ". " << contact_info[counter].first << " " << contact_info[counter].second; 
      counter++; 
      index++; 
     } 
     cout << "Choose any please: "; 
     cin >> choice; 
     found_at = found_at - (choice - 1); 
    } 
    contact_info.erase(contact_info.begin()+found_at); 
} 
void writeFile(ofstream contact_file) { 
    for (unsigned int i =0; i < contact_info.size(); i++) { 
     contact_file << contact_info[i].first << " " << contact_info[i].second << endl; 
    } 

} 
void readFile(ifstream contact_file) { 
    string input; 
    while (!contact_file.eof()) { 
    contact_file >> input; 
    size_t pos = input.find(" "); 
    string name = input.substr(0,pos); 
    string number_str = input.substr(pos); 
    int number = stoi(number_str) ; 
    contact_info.push_back(make_pair(name,number)); 
    } 
} 

}; 

int main() 
{ 
    int choice; 
    ifstream contacts_file_read; 
    contacts_file_read.open("contacts.txt"); 
    ofstream contacts_file_write; 
    contacts_file_write.open("contacts.txt"); 
    bool in_prog = true; 
    contact contacts; 
    string name; 
    int number; 
    while (in_prog) { 
    cout << "1. Add contacts" << endl 
     << "2. Edit contact" << endl 
     << "3. Delete contact" << endl 
     << "4. Show all" << endl 
     << "5. exit" << endl; 
    cout << "Your choice: "; 
    cin >> choice; 
    contacts.readFile(contacts_file_read); 
    if (choice == 1) { 
     cout << "Enter name & number separated by a space: "; 
     cin >> name >> number; 
     contacts.add_contact(name, number); 
    } else if (choice == 2) { 
     cout << "Enter name of contacts to be edited: "; 
     cin >> name; 
     contacts.edit_contact(name); 
    } else if (choice == 3) { 
    cout << "Enter name of contact to be deleted: "; 
    cin >> name; 
    contacts.delete_contact(name); 
} else if (choice == 4) { 
    contacts.show_all(); 
} else if(choice == 5) { 
    contacts.writeFile(contacts_file_write); 
} else { 
    cout << "Wrong choice" << endl; 
} 
} 



return 0; 
} 

所以,我在编程课上被问到用C++编写一个电话簿应用程序时只使用了对象,所以这是我的尝试。什么是已删除的函数,为什么只有我传递文件的函数被视为已删除?

所有功能都很好,我在完成每个函数后重新编译程序给了我0个错误,然而无论何时我尝试调用以前工作正常的writeFile或readFile函数,现在编译器给了我一个“错误:使用已删除的函数...“

我不知道什么是已删除的函数以及为什么只有将文件对象作为参数的函数才会这样处理。

任何人都可以请帮忙吗?

谢谢。

+0

[''虽然是错误的(EOF()!)。(HTTP://计算器。 COM /问题/ 5605125 /为什么 - 是 - iostreameof-内,一个循环条件考虑的,是错误的) – chris

回答

3

std::ifstream类型的对象不可复制 - 实际上,该对象表示打开文件的唯一句柄,并且难以概念化复制此类独特责任的含义。

实际上,这种无法复制对象的方法是通过删除复制构造函数来编码,这会导致您在尝试复制时看到的错误。

您的代码应该传递原始ifstream,不是副本(通过采取基准参数):

void readFile(ifstream & contact_file) 
//   ^^^^^^^^^^ 
相关问题