我正在努力为学校完成家庭作业,并且超出老师要求的任务 - >我创建了一个“列表”类。在向程序添加'add()'方法后,我继续遇到这两个错误 - 以及'newIncomeTax()'方法
错误LNK2019:函数_main driver.obj中引用了未解析的外部符号“public:void __thiscall List :: add(class IncomeTax *)”(?add @ List @@ QAEXPAVIncomeTax @@@ Z)
和
致命错误LNK1120:1个未解析的外部
我希望这对于任何想要帮助我的人来说都是足够的代码:
注意:以下功能不符合它们在原始代码中出现的顺序 (如果这可能是问题,我可以提供我正在使用的所有代码)
#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
注意:从我所看到的**我**所做的列表与默认行为类似
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++;
}
#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
#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;
}
#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 ++
答案 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循环进入下一次迭代,对象就会消失。