C ++错误LNK2019&&致命错误LNK1120:1个未解析的外部因素

时间:2010-01-15 16:49:12

标签: c++ list linker

我正在努力为学校完成家庭作业,并且超出老师要求的任务 - >我创建了一个“列表”类。在向程序添加'add()'方法后,我继续遇到这两个错误 - 以及'newIncomeTax()'方法

  

错误LNK2019:函数_main driver.obj中引用了未解析的外部符号“public:void __thiscall List :: add(class IncomeTax *)”(?add @ List @@ QAEXPAVIncomeTax @@@ Z)

  

致命错误LNK1120:1个未解析的外部

我希望这对于任何想要帮助我的人来说都是足够的代码:

注意:以下功能不符合它们在原始代码中出现的顺序 (如果这可能是问题,我可以提供我正在使用的所有代码)

list.h

#ifndef LIST_H
#define LIST_H

#include "IncomeTax.h"
class List
{
private:
    IncomeTax * First;
    IncomeTax * Last;
    int num_in_list;
public:
    List () { num_in_list = 0; First = NULL; Last = NULL; }
    int get_num_in_list() { return num_in_list; }
    IncomeTax * getFirst() { return First; }
    IncomeTax * getLast() { return Last; }
    void del_frnt ();
    void push_front (IncomeTax *);
    void push_back (IncomeTax *);
    void del_last ();
    void add (IncomeTax*);
    IncomeTax * pop_back ();
    IncomeTax * pop_front ();
    IncomeTax * get (int);
};
#endif

注意:从我所看到的**我**所做的列表与默认行为类似

list.cpp

中的'add'方法
void List:: add (IncomeTax * IncomeTax_to_be_added) {
    if (num_in_list == 0) { First = IncomeTax_to_be_added; Last = IncomeTax_to_be_added; }
    else if (num_in_list != 0 ) {
        Last->setNext(IncomeTax_to_be_added);
        IncomeTax_to_be_added->setPrevous(Last);
        Last = IncomeTax_to_be_added;
    }
    num_in_list++;
}

IncomeTax.h

#ifndef INCOME_TAX
#define INCOME_TAX

#include <iostream>
#include <string>
#include "conio.h"
#include <cassert>
using namespace std;

class IncomeTax {
private:
    double incm;
    double ajIncm;
    double subtract;
    double taxRate;
    double add;
    bool married;

    void calcIncome_m ();
    void calcIncome_s ();
public:
    IncomeTax () { incm = 0; subtract = 0; taxRate = 0; add = 0; add = false; }
    // married -> is by default false
    void setmarried ( bool stats ) { married = stats; }
    void setIncm (double in ) { incm = in; }
    void setSubtract ( double sub ) { subtract = sub; }
    void setTaxRate ( double rate ) { taxRate = rate; }
    void setAdd ( double Add ) { add = Add; }
    void setAjIncome ( double AJincome ) { ajIncm = AJincome; }

    bool getmarried () { return married; }
    double getIncm () { return incm; }
    double getsubtract () { return subtract; }
    double getTaxRate () { return taxRate; }
    double getAdd () { return add; }
    double getAJincome () { return ajIncm; }
    void calcIncome ();
    void pintIncome ();
};

#endif

IncomeTax.cpp

#include "IncomeTax.h"
using namespace std;

void IncomeTax::calcIncome(){
    assert (incm != 0);
    if (married) { calcIncome_m(); }
    if (!married) { calcIncome_s(); }

    ajIncm = (incm - subtract);
    ajIncm -= (ajIncm * taxRate);
    ajIncm += add; 
}

void IncomeTax::calcIncome_m() {
    assert (incm != 0);
    ... huge nested if statements ... 
    they set subtract, add, taxRate...
}

void IncomeTax::calcIncome_s() {
    assert (incm != 0);
    ... huge nested if statements ... 
    they set subtract, add, taxRate...
}

void IncomeTax::pintIncome () {
    assert (incm != 0);
    assert (ajIncm != 0);

    std::cout.precision(2);
    cout << "\tTaxable Income: " << incm << endl;
    cout << "\tAjusted Income: " << ajIncm << endl;
    cout << "\tTax: " << (incm - ajIncm) << "\n" << endl;
}

Driver.cpp

#include <conio.h>
#include <iostream>
#include <string>
#include <cassert>
#include "IncomeTax.h"
#include "List.h"
using namespace std;

void getMaritalStatus( IncomeTax new_tax) {
    bool done = false;
    char stt = ' ';
    while ( !done ) {
        cout << "\nPlease declare weather you are filing taxes jointly or single" << "\n";
        cout << "\t's' = single\n\t'm' = married" << endl;
        stt = getch();
        if ( stt == 's' || stt == 'm' ) { done = true; }
        if ( stt == 's' ) { new_tax.setmarried(true); }
        if ( ! (stt == 's' || stt == 'm') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
        if(cin.fail()) { cin.clear(); }
        }
    }


void get_Income ( IncomeTax new_tax) {
    double _incm = 0;
    char status = ' ';
    bool done = true;
    while ( done ) {
        cout << "Please enter your TAXABLE INCOME:" << endl;
        cin >> _incm;
        if ( _incm > 0 ) { new_tax.setIncm(_incm); done = false; }
        if ( _incm <= 0 ) { cout << "\nthe number you entered was less than zero\nplease enter a valad number...\n" << endl; } 
        if(cin.fail()) { cin.clear(); }
    }
    }

IncomeTax newIncomeTax () {
    IncomeTax new_tax;
    IncomeTax * temp;
    get_Income(new_tax);
    getMaritalStatus(new_tax);
    new_tax.calcIncome();
    return new_tax;
}

bool again () {
    bool done = false, answer = false;
    char yn = ' ';
    while ( !done ) {
        cout << "\nWould you like to calculate another Income tax? (y/n)" << endl;
        yn = getch();
        if ( yn == 'y' || yn == 'n' ) { done = true; }
        if ( yn == 'y' ) { return false; }
        if ( yn == 'n' ) { return true; }
        if ( ! (yn == 's' || yn == 'n') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
        if(cin.fail()) { cin.clear(); }
        }
    }

int main () {
    IncomeTax new_tax;
    List L;
    bool done = false;
    while (!done) {
        IncomeTax temp = newIncomeTax();
        IncomeTax * ptr = &temp;
        L.add(ptr);
        done = again();
        };

    return 0;
};

我知道有很多更好的方法来执行'if'语句 - &gt;我刚刚决定只使用if语句是有效的 - &gt;教授表示没有必要超越这个。

由于这是家庭作业,我希望得到一些反馈,我可以使用更好的编程技术。谢谢!

我正在使用VS express 2008 C ++

3 个答案:

答案 0 :(得分:2)

  

由于这是家庭作业,我希望得到一些反馈,我可以使用更好的编程技术。谢谢!

为您的类创建单独的标头/实现文件。不要将所有这些都放在一个标题中。并将您的main放在单独的实施文件中(如果愿意,可将其称为main.cpp)。

删除您未使用的所有功能,并尝试创建重现错误的最小示例 - 这将帮助您轻松找出问题,而无需不时回到SO。一次添加一个功能,看它是否编译,然后继续下一个,冲洗并重复。

添加函数时的另一个好主意是使用存根 - 空函数只是为了检查是否没有遇到任何这些未解决的符号错误(当你刚开始时)。

您还需要了解语法 - 在while的结尾括号之后不需要分号。您还将了解成员是按照声明的顺序进行初始化的(因此,您的int成员最好遵循您的IncomeTax成员)。您需要知道初始化列表是什么。你需要知道前方的声明。

简而言之,你需要一本书和许多练习。以下是我使用上面解释过的一些内容重构的代码:

class IncomeTax {};

class List
    {
    private:
        IncomeTax * First;
        IncomeTax * Last;
        int num_in_list;
    public:
        List () : 
            First(NULL), 
            Last(NULL),
                        num_in_list (0)
        {}
        ~List() 
        {
            // free First and Last ?
        }
        void add (IncomeTax*) {}    
};

    int main () {
        IncomeTax new_tax;
        List L;
        bool done = false;
        while (!done) {
            IncomeTax temp;
            L.add(&temp);
                done = true;
        }

        return 0;
    }

答案 1 :(得分:1)

在这里你还没有告诉我们其他的东西,因为这应该完美地链接(它在这里)。我刚刚在main()之前移动了List类声明,以避免在编译main时声明了类,但是其他一切都编译得很好。

// Something declared in this order (in the same file or through .h files) should compile & link correctly
class IncomeTax { ... };
class List { ... };
int main() { ... };

答案 2 :(得分:1)

看起来您可能忘记将IncomeTax对象文件(IncomeTax.o,IncomeTax.obj等)添加到链接命令行中,并且链接器告诉您它无法找到方法定义。< / p>

您可以通过临时创建一个“whole_project.cpp”文件来测试这一点,该文件包含按顺序复制粘贴的所有代码。如果它以这种方式正确编译和链接,那么您只需编辑makefile / IDE项目文件/手动命令行以指定它还需要包含目标文件。

它只显示一个错误,因为您实际上只调用了add函数而没有调用列表类中的其他非内联函数。

最后,仔细检查您用于将项目添加到列表的逻辑。我相信你添加的临时性会引起问题,因为只要while循环进入下一次迭代,对象就会消失。