2014-04-24 74 views
0

這是一個項目,我不得不動態地創建一個結構數組。不知道這些錯誤是什麼意思或我的代碼有什麼問題。動態分配。不知道這些錯誤意味着什麼

根據迄今爲止給出的建議,我的大部分問題都已解決。以下是剩餘錯誤的簡短列表。

/tmp/ccdjbURO.o: In function `main': 
assignment8.cpp:(.text+0x5a): undefined reference to `getData(menuItemType&, int&, std::basic_ifstream<char, std::char_traits<char> >&)' 
assignment8.cpp:(.text+0x116): undefined reference to `showMenu(menuItemType, int)' 
assignment8.cpp:(.text+0x1a5): undefined reference to `showMenu(menuItemType, int)' 
assignment8.cpp:(.text+0x29f): undefined reference to `makeSelection(int&, int, int)' 
assignment8.cpp:(.text+0x2eb): undefined reference to `printCheck(menuItemType, int, int)' 
collect2: error: ld returned 1 exit status 

這裏是我的函數原型和定義的要求。我發現原型和定義標題中的函數簽名與我程序主體中任何函數調用的格式沒有區別。

#include <iostream> 
    #include <iomanip> 
    #include <fstream> 
    #include <string> 

    using namespace std; 

    struct menuItemType 
    { 
     string menuItem; 
     double menuPrice; 
    }; 

    const double TAX = 0.05; 
    const string FILE_NAME = "Ch9_Ex5Data.txt"; 

    int getData(menuItemType&, int&, ifstream); 
    int makeSelection(int&, int, int); 
    void showMenu(menuItemType, int); 
    void printCheck(menuItemType, int, int); 
    void getInt(int&); 
    void getChar(char&); 

//******************************************************************************** 
//* getData 
//******************************************************************************** 
int getData(menuItemType* &menuList, int& listSize, ifstream& inFile) 
{ 
    inFile.open("Ch9_Ex5Data.txt"); 

    inFile >> listSize; 

    if (inFile.fail()) 
     return -1; 

    menuList = new menuItemType[listSize]; 

    for(int i = 0; i < listSize; i++) 
    { 
     getline(inFile, menuList[i].menuItem); 
     inFile >> menuList[i].menuPrice; 

     if (inFile.fail()) 
     return -1; 
     break; 
    } 
                     122,1   47% 
    return 1; 
} 

//******************************************************************************** 
//* makeSelection 
//******************************************************************************** 
int makeSelection(int* &orderList, int quantity, int index) 
{ 
    if ((orderList[index] + quantity) < 0) 
    { 
     cout << "Quantity selected makes total number ordered less than 0" 
       << endl << endl; 

     return 1; 
    } 

    else 
    { 
     orderList[index] = orderList[index] + 1; 

     return -1; 
    } 
} 

//******************************************************************************** 
//* showMenu 
//******************************************************************************** 
void showMenu(menuItemType *menuList, int listSize) 
{ 
    cout << fixed << showpoint << setprecision(2) << endl << endl 
     << "------Today's Menu------" << endl; 

    for(int i = 0; i < listSize; i++) 
    { 
     cout << left << setw(18) << menuList[i].menuItem << "$ " 
      << right << setw(4) << menuList[i].menuPrice << endl; 
    } 

    cout << "------------------------" 
     << endl << endl; 
} 

//******************************************************************************** 
//* printCheck 
//******************************************************************************** 
void printCheck(menuItemType *menuList, int *orderList, int listSize) 
{ 
    int taxDue = 0; 
    int amntDue = 0; 

    cout << fixed << showpoint << setprecision(2) << endl << endl 
     << "------Your Reciept------" << endl; 

    for (int i = 0; i < listSize; i++) 
    { 
     if (orderList[i] > 0) 
     { 
     cout << left << setw(2) << orderList[i] << " " 
       << setw(15) << menuList[i].menuItem 
       << right << setw(5) << (orderList[i] * menuList[i].menuPrice) 
       << endl; 

     amntDue += (orderList[i] * menuList[i].menuPrice); 
     } 
    } 
                     210,1   73% 
taxDue = amntDue * TAX; 

    amntDue = amntDue * (1 + TAX); 

    cout << endl << right << setw(17) << "Tax: $ " 
        << setw(7) << taxDue 
     << endl << right << setw(17) << "Amount Due: $ " 
        << setw(7) << amntDue 
     << endl 
     << "------------------------" << endl << endl; 
} 

                    187,0-1  64% 
+0

你不能複製ifstream的,而且也沒有所謂的'函數getline(字符串)'只有一個'函數getline(istream的和,串)功能'因爲你自然需要告訴程序:像這樣的東西代替它們它應該從那裏獲得該線。 – PeterT

回答

0

錯誤看起來不友好,但問題很簡單。

您的ifstream

int getData(menuItemType* &menuList, int& listSize, ifstream inFile)

的值,它隱含試圖把它拷貝過去。

我認爲它不可能複製istreamostream。你必須通過引用來傳遞它們。

此外,正如@PeterT在評論中所說,沒有您嘗試調用的getline版本。這兩個默認版本都需要inputstring作爲參數。

+0

大部分錯誤都是由此產生的。然後我意識到我公然忘記包含一個istream變量作爲getline的參數。現在我剩下一小堆錯誤,但我不知道這些意思是什麼。這些錯誤討論了函數的未定義引用,但不提供任何行號。這些可能表明什麼?下面顯示的錯誤。 – user3569354

+0

/tmp/ccdjbURO.o:函數'main': assignment8.cpp :(.text + 0x5a):對getData(menuItemType&,int&,std :: basic_ifstream > )' assignment8.cpp :(。text + 0x116):對'showMenu(menuItemType,int)'的未定義引用' assignment8.cpp :(.text + 0x1a5):對'showMenu(menuItemType,int)'的未定義引用' assignment8 .cpp :(.text + 0x29f):對'makeSelection(int&,int,int)'的未定義引用' assignment8.cpp :(.text + 0x2eb):'printCheck(menuItemType,int,int)'的未定義引用collect2 :錯誤:ld返回1退出狀態 – user3569354

+0

這些是鏈接器錯誤。你沒有鏈接對象與這些功能。你需要爲它們提供定義。然而,這是一個不同的問題。 – luk32

0

您的轉發聲明與定義不同。

int getData(menuItemType*&, int&, ifstream&); 
int makeSelection(int*&, int, int); 
void showMenu(menuItemType*, int); 
void printCheck(menuItemType*, int*, int); 
void getInt(int&); 
void getChar(char&); 
相關問題