Получение ошибок компоновщика - PullRequest
0 голосов
/ 11 декабря 2011

Я написал эту программу, руководствуясь указаниями моего инструктора.Как только я наконец исправил все мои опечатки и синтаксические ошибки, я попытался скомпилировать программу и восстановил 5 ошибок компоновщика.Насколько я могу судить, в программе нет ничего плохого, поэтому мне было интересно, если кто-нибудь из вас мог бы указать мне правильное направление.
Спасибо

Ошибки компоновщика, которые я получаю:

Error   2 error LNK2019: unresolved external symbol "void __cdecl write_records(class SalesRecord *)" (?write_records@@YAXPAVSalesRecord@@@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 *)" (?calc_discounts@@YAXPAVSalesRecord@@@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> > &)" (?read_records@@YAPAVSalesRecord@@AAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@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;         
} 

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Вы не предоставили определения для методов:

write_records
calc_discounts
read_records

Вот почему линкер жалуется.

Редактировать: Чтобы решить эту проблему, вы должны предоставить определение для этих методов в том же файле или, что еще лучше, отдельные объявления классов в файле .hpp и определения классов в файле .cpp.

0 голосов
/ 11 декабря 2011

Компилятор жалуется, что вы используете некоторые функции, для которых вы не дали ему код.

Определения этих функций (не предварительные объявления) не присутствуют в опубликованном вами коде. Если они существуют в каком-то другом файле .cpp, вы должны убедиться, что этот файл также является частью вашего проекта (чтобы компилятор и компоновщик знали, как его скомпилировать и использовать найденный там код). В противном случае вам просто нужно написать реализацию.

0 голосов
/ 11 декабря 2011

Скорее всего, вы забыли реализацию этих функций. Убедитесь, что у вас есть хватка этих функций, а не просто объявляйте их.

...