2011-12-11 3 views
0

私のインストラクターが設定したガイドラインを使用してこのプログラムを作成しました。最終的にすべての誤植と構文エラーを修正した後、私はプログラムをコンパイルして5つのリンカエラーを復活させようとしました。私が言う限り、プログラムには何も間違っているとは言えません。あなたの誰かが私を正しい方向に向けることができるかどうか疑問に思っていました。あなたはこれらの関数の実装を忘れてしまった可能性が高いリンカーエラーを取得する

Error 2 error LNK2019: unresolved external symbol "void __cdecl write_records(class SalesRecord *)" ([email protected]@[email protected]@@Z) referenced in function _main C:\Users\Home\Documents\Visual Studio 2010\Projects\Assignment10\Assignment10\Assign10.obj 

Error 3 error LNK2019: unresolved external symbol "void __cdecl calc_discounts(class SalesRecord *)" ([email protected]@[email protected]@@Z) referenced in function _main C:\Users\Home\Documents\Visual Studio 2010\Projects\Assignment10\Assignment10\Assign10.obj 

Error 4 error LNK2019: unresolved external symbol "class SalesRecord * __cdecl read_records(class std::basic_ifstream<char,struct std::char_traits<char> > &)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@@[email protected]@@Z) referenced in function _main C:\Users\Home\Documents\Visual Studio 2010\Projects\Assignment10\Assignment10\Assign10.obj 

Error 5 error LNK1120: 3 unresolved externals C:\Users\Home\Documents\Visual Studio 2010\Projects\Assignment10\Debug\Assignment10.exe 1 
//Author William Lovejoy 
//Assignment 10 

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <cstdlib> 
#include <string> 
using namespace std; 

const int MAX_FILE_NAME = 35; 
const int MAX_ID_LEN  = 10; 
const int MAX_NAME_LEN = 30; 
const double DISCOUNT = 0.10; 
const double DISCOUNT_BREAK_POINT = 10; 


class SalesRecord; 
typedef SalesRecord * SalesRecordPtr; 

class SalesRecord 
{ private: 
     char item_id[MAX_ID_LEN + 1]; 
    char item_name[MAX_NAME_LEN + 1]; 
    int quantity_sold; 
    double regular_price; 
    double discount_price; 
    double total_price; 
    SalesRecord *next; 
    public: 
    SalesRecord(); 
    void read(ifstream& in); 
    void calc_discount_price(); 
    void write(ostream & os) const; 
    int quantity(); 
    double total_for_item(); 
    bool operator<(const SalesRecord& right) const; 

     friend SalesRecordPtr read_records (ifstream& in); 
    friend void calc_discounts(SalesRecordPtr head); 
    friend void write_records(SalesRecordPtr head); 
    friend void append(SalesRecordPtr& head, SalesRecord& thisrecord); 
    friend void delete_records(SalesRecordPtr& head); 

}; 

void open_input(ifstream& input, char name[]); 
void open_output(ofstream& output, char name[]); 

int main() 
{ char again; 
int num_records; 
char infilename[MAX_FILE_NAME + 1]; 
ifstream in; 
SalesRecordPtr records = NULL; 

do 
{ open_input(in, infilename); 
    records = read_records(in); 
    in.close();        
    if (records != NULL) 
    { calc_discounts(records);  
    write_records(records); 
    delete_records(records);      
    } 
    else 
    { cout << "\n\n\aNo data in file: " << infilename << endl; 
    } 

    cout << "\nDo you want to process another file (Y/N)? "; 
    cin >> again; 
    cin.ignore(1, '\n'); 
    } 
    while (again == 'y' || again == 'Y'); 

    cout << "\n\n***** END OF PROGRAM ******\n"; 
    return 0; 
} 

void open_input(ifstream& input, char name[]) 
{ int count = 0;    
    do 
    { count++; 
     if (count != 1) 
     { cout << "\n\aInvalid file name or file does not exist. Please try again." 
       << endl; 
     } 

     cout << "\nEnter the input file name (maximum of " << MAX_FILE_NAME 
      << " characters please)\n:> "; 
     cin.get(name, MAX_FILE_NAME + 1); 
     cin.ignore(81, '\n');   
     input.clear();     
    } while (input.fail());    
} 

void open_output(ofstream& output, char name[]) 
{ int count = 0;   
    do 
    { count++; 
     if (count != 1) 
     { cout << "\n\aInvalid file name or file does not exist. Please try again." 
       << endl; 
     } 

     cout << "\nEnter the input file name (maximum of " << MAX_FILE_NAME 
      << " characters please)\n:> "; 
     cin.get(name, MAX_FILE_NAME + 1); 
     cin.ignore(81, '\n');   
     output.clear();     
     output.open(name); 
    } while (output.fail());    
} 

bool SalesRecord::operator<(const SalesRecord& right) const 

{ if (_stricmp(item_name, right.item_name) < 0) return true; 
    else          return false; 
} 

SalesRecord::SalesRecord() 
{ next = NULL; 
} 

void SalesRecord::read(ifstream& in)  

{ in.get(item_id, MAX_ID_LEN +1);  
    while (in.get() != '\n');    

    in.get(item_name, MAX_NAME_LEN +1);  
    while (in.get() != '\n');    

    in >> quantity_sold >> regular_price; 
    while (in.get() != '\n');    

} 

void SalesRecord::calc_discount_price()  
{ double discount_rate; 

    if (quantity_sold < DISCOUNT_BREAK_POINT) 
     discount_rate = 0.0; 
    else 
     discount_rate = DISCOUNT; 

    discount_price = regular_price - (discount_rate * regular_price); 
    total_price = quantity_sold * discount_price; 
} 

void SalesRecord::write(ostream & os) const              
{ os.setf(ios::fixed); os.setf(ios::showpoint); os.precision(2); 

    os << item_id << "\n" << item_name << "\n" 
     << quantity_sold << " " << discount_price << " " 
     << total_price << endl; 
}  

void append(SalesRecordPtr& head, SalesRecord& thisrecord) 

{ SalesRecord * new_record = NULL; 
    SalesRecord * last  = NULL; 

    new_record = new SalesRecord;  
    if (new_record == NULL) 
    { cout << "\aCan not allocate memory!"; 
     exit(1); 
    } 

    *new_record = thisrecord;     
    new_record->next = NULL;   

    if (head == NULL)    
    { head = new_record; 
    } 
    else        
    { last = head;     
     while (last->next != NULL)  
     { last = last->next;   
     } 

     last->next = new_record;  
    } 
} 

void delete_records(SalesRecordPtr& head)            
{ SalesRecord * current = NULL; 
    SalesRecord * deadmeat = NULL; 

    current = head;    
    while (current != NULL)   
    { deadmeat = current;   
     current = current->next; 
     delete deadmeat;   
    } 

    head = NULL;   
} 
+0

あなたのプログラムに欠陥がないことは間違いないので、私はあなたのタイトルを編集しました...! –

+0

質問の良いタイトルを書く方法については、[このページ](http://meta.stackexchange.com/questions/10647/writing-good-titles)をご覧ください。 – declan

答えて

0

より:
はあなたに私が受けてる

リンカエラーをありがとうございました。それらを宣言するのではなく、それらの機能の勇気があることを確認してください。

0

コンパイラは、コードを与えていない関数をいくつか使用していると不平を言っています。

投稿したコードには、これらの関数の定義(前方宣言ではない)はありません。それらが他の.cppファイルに存在する場合は、ファイルもプロジェクトの一部であることを確認する必要があります(コンパイラーとリンカーはコンパイルしてそこにあるコードを使用します)。それ以外の場合は、実装を記述するだけです。

1

あなたがメソッドの定義を提供していない:

リンカが不平を言う理由です
write_records 
calc_discounts 
read_records 

編集:問題を解決するには、これらのメソッドの定義を同じファイルに提供するか、.hppファイル内のクラス宣言と.cppファイル内のクラス定義を分離する必要があります。

関連する問題