C ++ error LNK2019 && fatal error LNK1120: 1 unresolved external

I am trying to work on homework for the school, and I turn to the fact that the teacher asks for an assignment → I created a list class. I continue to encounter these two errors after adding the "add ()" method to the program along with the "newIncomeTax ()" methods

error LNK2019: unresolved external symbol "public: void __thiscall List :: add (class IncomeTax *)" (? add @List @@ QAEXPAVIncomeTax @@@ Z) link to the _main driver.obj function

and

fatal error LNK1120: 1 unresolved external

Hopefully this will be enough code for those trying to help me:

Note: the functions below do not correspond to what they appear in the source code (if this may be a problem, I can provide all the code that I use)

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

Note: from what I saw, the list that ** I ** made behaves similarly by default

'add' method from list.cpp

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;
};

I know that there are many better ways to make “if” statements → I just decided that it would be efficient to just use if statuses → the professor stated that there was no need to go beyond that.

Since this is homework, I would like to get some information on how I can use the best programming methods. thank you

I am using VS express 2008 C ++

+3
3

, , . !

/ . . 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;
    }
+2

- , ( ). List main(), main, .

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

, , , IncomeTax (IncomeTax.o, IncomeTax.obj ..) , , .

, "whole_project.cpp", , . , / makefile/IDE, , .

It shows only one error, because you are actually calling the add function and none of the other non-built-in functions in the list class.

Finally, double-check the logic you use to add items to the list. I believe that temporarily adding will lead to problems as the object leaves as soon as the while loop enters the next iteration.

+1
source

Source: https://habr.com/ru/post/1728658/


All Articles