gpt4 book ai didi

c++ - 已经定义了 Obj?链接错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:52 24 4
gpt4 key购买 nike

我一辈子都弄不明白为什么会出现这些错误,尤其是因为我已经包含了 guard 。

这些是我的错误(请忽略我给电脑起的名字):

1>main.obj : error LNK2005: "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 : error LNK2005: "class std::basic_ostream > >& __cdecl operator<<(class std::basic_ostream > &,class >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 multiply >defined symbols found

这是我的 4 个文件: 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

贷款.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

贷款.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

日期.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

请帮忙!

最佳答案

如评论中所述,<< 运算符需要内联或在 cpp 文件中定义。当您在头文件中定义函数时,它将在您包含头文件的每个 cpp 文件中进行编译。如果您在多个 cpp 文件中包含 header ,则会出现编译器错误,因为相同的代码将被编译成多个 .obj 文件。链接器不知道要使用哪个 .obj 文件并抛出错误。

解决方案 1 - 拆分为 .h 和 .cpp

贷款.h

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

贷款.cpp

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

解决方案 2 - 内联

贷款.h

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

第二种解决方案将导致编译器通过在代码中发生调用的每个位置内联函数代码来解析函数调用。这会导致编译代码中的冗余,对于大型函数应该避免。

解决方案 3 - 静态

贷款.h

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

通过将函数声明为静态的,它具有内部链接。您仍将决定编译器是否将其内联到编译器。

关于c++ - 已经定义了 Obj?链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com