2016-04-04 53 views
0

我目前有一個main.cc和database.cc文件可以很好地工作,但是我的main.cc文件與它將要測試的文件不匹配。我試圖轉換它,但它一直拋出錯誤,我沒有時間打破我的整個代碼並重新開始。C++使編程兼容

這是我database.cc文件:

#include<list> 
#include<algorithm> 
#include<iostream> 
#include<string> 
#include<fstream> 
#ifndef passenger_h 
#define passenger_h 
using std::string; 
using std::cin; 
using std::cout; 
using std::list; 
using std::endl; 

class Passenger { 
public: 
    Passenger() {} 
    Passenger(string, string, string); 
    bool operator==(const Passenger&) const; 
    bool operator<(const Passenger&) const; 
    void print(std::ostream& os); 
private: 
    string fname, lname, destination; 

}; 

class Flightlist { 
public: 
    int menu(); 
    void read_from_file(string); 
    void insert(Passenger p); 
    void remove(Passenger p); 
    bool check_reservation(Passenger p); 
    void display_list(); 
    void save_to_file(string); 
private: 
    list<Passenger> flist; 
}; 

#endif 


Passenger::Passenger(string first, string last, string dest) 
{ 
    fname = first; 
    lname = last; 
    destination = dest; 
} 

bool Passenger::operator==(const Passenger& p) const 
{ 
    return fname == p.fname && lname == p.lname; 
} 

bool Passenger::operator<(const Passenger& p) const 
{ 
    return fname < p.fname || (fname == p.fname && lname < p.lname); 
} 

void Passenger::print(std::ostream& os) 
{ 
    os << fname << ' ' << lname << ' ' << destination << '\n'; 
} 

int Flightlist::menu() 
{ 
    int option; 
    cout << endl; 
    cout << "Enter one of the following options:" << endl; 
    cout << "1. load reservations from file:" << endl; 
    cout << "2. reserve a ticket" << endl; 
    cout << "3. cancel a reservation" << endl; 
    cout << "4. check reservation" << endl; 
    cout << "5. display passenger list" << endl; 
    cout << "6. save passenger list" << endl; 
    cout << "7. exit" << endl << endl; 
    cin >> option; 
    cin.get(); 
    return option; 
} 

void Flightlist::read_from_file(string filename) 
{ 
    string fname, lname, destination; 
    std::ifstream input(filename.c_str()); 
    while (input >> fname >> lname >> destination) 
    {     
     flist.push_back(Passenger(fname, lname, destination)); 
    } 
    input.close(); 
} 

void Flightlist::insert(Passenger p) 
{ 
    flist.push_back(p); 
} 

void Flightlist::remove(Passenger p) 
{ 
    flist.remove(p); 
} 

bool Flightlist::check_reservation(Passenger p) 
{ 
    list<Passenger>::iterator i1, i2; 
    i1 = flist.begin(); 
    i2 = flist.end(); 
    return flist.end() != find(flist.begin(), flist.end(), p); 
} 

void Flightlist::display_list() 
{ 
    flist.sort(); 
    list<Passenger>::iterator i1, i2; 
    i1 = flist.begin(); 
    i2 = flist.end(); 
    for (; i1 != i2; ++i1) { 
     i1->print(cout); 
    } 
} 

void Flightlist::save_to_file(string filename) 
{ 
    flist.sort(); 
    list<Passenger>::iterator i1, i2; 
    i1 = flist.begin(); 
    i2 = flist.end(); 
    std::ofstream output(filename.c_str()); 
    for (; i1 != i2; ++i1) { 
     i1->print(output); 
    } 
    output.close(); 
} 

這是我目前main.cc文件,它與上述程序完美的作品:

#include "database.cc" 

    int main() 
    { 
     Flightlist flight_list; 
     string fname, lname, destination; 

    while (true) 
    { 
     switch (flight_list.menu()) 
     { 
      case 1: 
       { 
        flight_list.read_from_file("ticket_reservations.dat"); 
        break; 
       } 

      case 2: 
       { 
        cout << "first name of passenger:" << endl; 
        cin >> fname; 
        cout << "last name of passenger" << endl; 
        cin >> lname; 
        cout << "destination of passenger" << endl; 
        cin >> destination; 
        flight_list.insert(Passenger(fname, lname, destination)); 
        break; 
       } 

      case 3: 
       { 
        cout << "first name of passenger:" << endl; 
        cin >> fname; 
        cout << "last name of passenger" << endl; 
        cin >> lname; 
        cout << "destination of passenger" << endl; 
        cin >> destination; 
        flight_list.remove(Passenger(fname, lname, destination)); 
        break; 
       } 

      case 4: 
       { 
        cout << "first name of passenger:" << endl; 
        cin >> fname; 
        cout << "last name of passenger" << endl; 
        cin >> lname; 
        cout << "destination of passenger" << endl; 
        cin >> destination; 
        if (flight_list.check_reservation(Passenger(fname, lname, destination))) 
         cout << "this passenger has a ticket reservation" << endl; 
        else 
         cout << "this passenger does not have a ticket reservation" << endl; 
        break; 
       } 

      case 5: 
       { 
        flight_list.display_list(); 
        break; 
       } 

      case 6: 
       { 
        flight_list.save_to_file("ticket_reservations.dat"); 
       } 
       break; 


      case 7: 
       return 0; 
     } 
    } 

    return 0; 
} 

這是main.cc文件我的程序將進行測試,因此我需要將我的代碼轉換爲兼容:

#include "database.cc" 

int main() 
{ 
    list<Passenger> flight_list; 
    string first_name, last_name, destination; 

    while (true) 
    { 
     switch (menu()) 
     { 
      case 1: 
       { 
        read_from_file(flight_list, "ticket_reservations.dat"); 
        break; 
       } 

      case 2: 
       { 
        cout << "name of passenger:" << endl; 
        cin >> first_name >> last_name; 
        cout << "destination:" << endl; 
        cin.ignore(); 
        getline(cin, destination); 
        insert(flight_list, first_name, last_name, destination); 
        break; 
       } 

      case 3: 
       { 
        cout << "name of passenger:" << endl; 
        cin >> first_name >> last_name; 
        remove(flight_list, first_name, last_name); 
        break; 
       } 

      case 4: 
       { 
        cout << "name of passenger:" << endl; 
        cin >> first_name >> last_name; 
        if (check_reservation(flight_list, first_name, last_name)) 
         cout << "this passenger has a ticket reservation" << endl; 
        else 
         cout << "this passenger does not have a ticket reservation" << endl; 
        break; 
       } 

      case 5: 
       { 
        display_list(flight_list); 
        break; 
       } 

      case 6: 
       { 
        save_to_file(flight_list, "ticket_reservations.dat"); 
       } 
       break; 

      case 7: 
       return 0; 
     } 
    } 

    return 0; 
} 

我非常爲大量的代碼表示歉意,但我非常需要這方面的幫助。謝謝!

+3

我不得不承認,在我20多年的C++開發中,我從來沒有見過任何人包含.cc/.cpp文件。我很驚訝,即使編譯。 – MrEricSir

+1

@MrEricSir這就是我們獲得代碼的方式,我無法控制那部分。我自己做了一個單獨的.h文件來利用,但被告知它不被允許,並且它必須在同一個實現文件中。 – Brittany

+0

@MrEricSir但它編譯和正確使用我寫的main.cc文件,所以在這裏確實不是問題。請,任何幫助將如此讚賞。 – Brittany

回答

0

你的功能不起作用,因爲你從未將它們定義爲一般功能;他們是班級職能成員。

您需要通過列表進行迭代,並調用類的成員 - 我不會重寫所有的代碼,但這裏的一個例證:

list<MyClass> MyList; 
// ... your list is populated here .. 
for(auto iter=MyList.begin(); iter!=MyList.end(); ++iter) { 
    // ... decide what to do here ... 
    *iter->MyMethod(argument1,argument2) 
    // ... etc ... 
} 

注意我打電話的MyMethod作爲類成員,不是作爲一個函數(首先,你需要調整你的代碼來調用你的方法,也就是說你需要在你的類實例以外的地方通過你的列表。)

要掌握的重要一點是您使用.(或->,如果您通過指針訪問它)訪問您的函數成員;您不能稱其爲可怕可以作爲一個功能。

您唯一的其他選擇是將包裝函數添加到您的database.cc中,定義您嘗試在新的main.cc中調用的函數。

0

這是一個新的Database.cc似乎編譯。

看來,測試main.cc調用免費功能,所以我在每個功能存根創建新的對象。

而且我爲Flightlist添加了一個構造函數列表。

// #include "stdafx.h" // uncomment for MS version 
    #include<list> 
    #include<algorithm> 
    #include<iostream> 
    #include<string> 
    #include<fstream> 
    #ifndef passenger_h 
    #define passenger_h 
    using std::string; 
    using std::cin; 
    using std::cout; 
    using std::list; 
    using std::endl; 

    class Passenger { 
    public: 
     Passenger() {} 
     Passenger(string, string, string); 
     bool operator==(const Passenger&) const; 
     bool operator<(const Passenger&) const; 
     void print(std::ostream& os); 
    private: 
     string fname, lname, destination; 

    }; 

    class Flightlist { 
    public: 
     int menu(); 
     void read_from_file(string); 
     void insert(Passenger p); 
     void remove(Passenger p); 
     bool check_reservation(Passenger p); 
     void display_list(); 
     void save_to_file(string); 

    // --- CHANGES START ---------------- 

     Flightlist() {}; 
     ~Flightlist() {}; 
     Flightlist(list<Passenger> flistInput) : flist(flistInput){}; 
    private: 
     list<Passenger> flist; 
    }; 

    int menu() { 
     static Flightlist FL; 
     return FL.menu(); 
    } 

    void read_from_file(list<Passenger> flist, string s) { 
     Flightlist FL(flist); 
     FL.read_from_file(s); 
    } 

    void insert(list<Passenger> flist, string first, string last, string dest) { 
     Flightlist FL(flist); 
     Passenger p(first, last, dest); 
     FL.insert(p); 
    } 

    void remove(list<Passenger> flist, string first, string last) { 
     Flightlist FL(flist); 
     Passenger p(first, last, NULL); 
     FL.remove(p); 
    } 

    bool check_reservation(list<Passenger> flist, string first, string last) { 
     Flightlist FL(flist); 
     Passenger p(first, last, NULL); 
     return FL.check_reservation(p); 
    } 

    void display_list(list<Passenger> flist) { 
     Flightlist FL(flist); 
     FL.display_list(); 
    } 

    void save_to_file(list<Passenger> flist, string s) { 
     Flightlist FL(flist); 
     FL.save_to_file(s); 
    } 

    // --- CHANGES STOP ---------------- 

    #endif 


    Passenger::Passenger(string first, string last, string dest) 
    { 
     fname = first; 
     lname = last; 
     destination = dest; 
    } 

    bool Passenger::operator==(const Passenger& p) const 
    { 
     return fname == p.fname && lname == p.lname; 
    } 

    bool Passenger::operator<(const Passenger& p) const 
    { 
     return fname < p.fname || (fname == p.fname && lname < p.lname); 
    } 

    void Passenger::print(std::ostream& os) 
    { 
     os << fname << ' ' << lname << ' ' << destination << '\n'; 
    } 

    int Flightlist::menu() 
    { 
     int option; 
     cout << endl; 
     cout << "Enter one of the following options:" << endl; 
     cout << "1. load reservations from file:" << endl; 
     cout << "2. reserve a ticket" << endl; 
     cout << "3. cancel a reservation" << endl; 
     cout << "4. check reservation" << endl; 
     cout << "5. display passenger list" << endl; 
     cout << "6. save passenger list" << endl; 
     cout << "7. exit" << endl << endl; 
     cin >> option; 
     cin.get(); 
     return option; 
    } 

    void Flightlist::read_from_file(string filename) 
    { 
     string fname, lname, destination; 
     std::ifstream input(filename.c_str()); 
     while (input >> fname >> lname >> destination) 
     { 
      flist.push_back(Passenger(fname, lname, destination)); 
     } 
     input.close(); 
    } 

    void Flightlist::insert(Passenger p) 
    { 
     flist.push_back(p); 
    } 

    void Flightlist::remove(Passenger p) 
    { 
     flist.remove(p); 
    } 

    bool Flightlist::check_reservation(Passenger p) 
    { 
     list<Passenger>::iterator i1, i2; 
     i1 = flist.begin(); 
     i2 = flist.end(); 
     return flist.end() != find(flist.begin(), flist.end(), p); 
    } 

    void Flightlist::display_list() 
    { 
     flist.sort(); 
     list<Passenger>::iterator i1, i2; 
     i1 = flist.begin(); 
     i2 = flist.end(); 
     for (; i1 != i2; ++i1) { 
      i1->print(cout); 
     } 
    } 

    void Flightlist::save_to_file(string filename) 
    { 
     flist.sort(); 
     list<Passenger>::iterator i1, i2; 
     i1 = flist.begin(); 
     i2 = flist.end(); 
     std::ofstream output(filename.c_str()); 
     for (; i1 != i2; ++i1) { 
      i1->print(output); 
     } 
     output.close(); 
    } 
+0

我非常感謝你的努力。但是我被告知我必須刪除'Flightlist'類並使其以這種方式工作。非常感謝你,但是 – Brittany