【问题标题】:Already defined Obj? Linking error?已经定义了 Obj?链接错误?
【发布时间】:2013-10-09 12:41:07
【问题描述】:

我一生都无法弄清楚为什么会出现这些错误,尤其是因为我已经包含了警卫。

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

1>main.obj : error LNK2005: "class std::basic_ostream > >& __cdecl operator &,class >Date &)" (??6@YAAAV?$basic_ostream@ DU?$char_traits@D@std@@@std@@AAV01@AAVDate@@@Z) 已经>在loan.obj中定义

1>main.obj : error LNK2005: "class std::basic_ostream > >& __cdecl operator &,class >Loan &)" (??6@YAAAV?$basic_ostream@ DU?$char_traits@D@std@@@std@@AAV01@AAVLoan@@@Z) 已经>在loan.obj中定义

1>C:\Users\SweetAssSarah\Documents\Visual Studio >2012\Projects\ConsoleApplication4\Debug\a1.exe:致命错误 LNK1169:一个或多个相乘 >找到定义的符号

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

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

请帮忙!

【问题讨论】:

  • 只需将 inline 放在您的 operator
  • 我从未听说过 inline - 非常感谢您向我介绍它!
  • inline 为我工作(在cpp 中)。还在考虑为什么。

标签: c++ visual-studio


【解决方案1】:

如 cmets 中所述,

解决方案 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; 
}

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

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2012-10-06
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多