Already identified by Obj? Communication error?

I cannot understand for life why I get these errors, especially since I have security guards.

These are my mistakes (please ignore what I called my computer):

1> main.obj: LNK2005 error: "class std :: basic_ostream → & __cdecl operator <(class std :: basic_ostream> &, class> Date &)" (?? 6 @YAAAV? $ Basic_ostream @DU? $ Char_traits @ D @std @@@ std @@ AAV01 @AAVDate @@@ Z) already> defined in loan.obj

1> main.obj: LNK2005 error: "class std :: basic_ostream → & __cdecl operator <(class std :: basic_ostream> &, classes> Loan &)" (?? 6 @YAAAV? $ Basic_ostream @DU? $ Char_traits @ D @std @@@ std @@ AAV01 @AAVLoan @@@ Z) already> defined in loan.obj

1> C: \ Users \ SweetAssSarah \ Documents \ Visual Studio> 2012 \ Projects \ ConsoleApplication4 \ Debug \ a1.exe: fatal error LNK1169: one or more propagated> found characters were found

And here are my 4 files: Main.cpp:

#ifndef _main_cpp
#define _main_cpp

#include<iostream>
#include "loan.h"
#include "date.h"

using namespace std;

void main(){
    const int MAX_SIZE = 80;
    char response[MAX_SIZE];

    Loan sarah("Sarah", "123 Awesomeville ", Date (01,February,2010));

    cout << sarah.getName() << " address: " << sarah.getAddress() << endl;
    cout << "Date: " << sarah.getDate() << endl;

    //keep console open until user types a key and enter
    cout <<"\n\n" << "Press ENTER to continue";
    cin.getline(response, MAX_SIZE);

    return;
}    
#endif

loan.cpp:

#ifndef _loan_cpp
#define _loan_cpp

#include <iostream>
#include "loan.h"
#include "date.h"

using namespace std;

Loan::Loan(char * aName, char * anAddress, Date aDate){
    name = aName;
    address = anAddress;
    date = aDate;
    cout <<"CONSTRUCTING: " << name << "\n"; 
}    
Loan::~Loan(){
    cout << "DESTRUCTING: " << name << endl;
} 
char * Loan::getName() {return  name;} 
char * Loan::getAddress(){return address;} 
Date Loan::getDate(){return date;}

void Loan:: printOn(ostream & ostr) {
    cout << name << " address: " << address << endl;
}    
#endif

loan.h:

#ifndef _loan_h
#define _loan_h

#include <math.h> //for the pow() function to do exponentiation
#include <iostream>
#include "date.h"

using namespace std;

class Loan{
public:
    Loan(char *, char *, Date );//constructor
    ~Loan();

    char * getName();
    char * getAddress();
    Date getDate();

    void printOn(ostream & ostr);
private: 
    char * name; 
    char * address;
    Date date; //requires class Date to have a default constructor

};
ostream & operator<<(ostream & ostr, Loan & aLoan) { 
    aLoan.printOn(ostr); 
    return ostr; 
}
#endif

date.h:

#ifndef _date_h
#define _date_h
#include <iostream>

enum Month {January=1, February, March, April, May, June, July, August,
September, October, November, December};

using namespace std;

class Date{
public:
//  Date() {};
    Date(int aDay = 1, Month aMonth = May, int aYear = 2005){
        day = aDay;
        month = aMonth;
        year = aYear;
}    
void printOn(ostream & o){
    o << day << "/" << month << "/" << year;
}
private:
    int day;
    Month month;
    int year;
};    
ostream & operator<<(ostream & ostr, Date & d) { 
    d.printOn(ostr); 
    return ostr; 
} 
#endif

Please, help!

+4
source share
1 answer

As noted in the comments, the <statement must be inline or defined in the cpp file. When you define a function in the header file, it will be compiled in every cpp file where you include the header. If you include the header in more than one cpp file, you get compiler errors because the same code will be compiled into multiple .obj files. The compiler does not know which .obj file to use and throws an error.

1 - .h .cpp

loan.h

ostream & operator<<(ostream & ostr, Loan & aLoan);

loan.cpp

ostream & operator<<(ostream & ostr, Loan & aLoan) { 
    aLoan.printOn(ostr); 
    return ostr; 
}

2 -

loan.h

inline ostream & operator<<(ostream & ostr, Loan & aLoan) { 
    aLoan.printOn(ostr); 
    return ostr; 
}

, , . .

3 -

loan.h

static ostream & operator<<(ostream & ostr, Loan & aLoan) { 
    aLoan.printOn(ostr); 
    return ostr; 
}

, . - , .

+12

All Articles