C++ 错误 LNK2019:未解析的外部符号“public: __thiscall user::user(void)” (??0user@@QAE@XZ) 在函数“...”中引用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14448963/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Error LNK2019: unresolved external symbol "public: __thiscall user::user(void)" (??0user@@QAE@XZ) referenced in function "..."
提问by tarantino
Possible Duplicate:
What is an undefined reference/unresolved external symbol error and how do I fix it?
I am trying to code a college assignment and seem to having problems compiling, i have done a Google search on the error and the fixes I've seen don't work with my code. I would appreciate your help.
我正在尝试编写大学作业的代码,但似乎在编译时遇到了问题,我已经对错误进行了 Google 搜索,并且我看到的修复程序不适用于我的代码。我会很感激你的帮助。
Below is the error code :
以下是错误代码:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall user::user(void)" (??0user@@QAE@XZ)
referenced in function "void __cdecl `dynamic initializer for 'player''(void)" (??__Eplayer@@YAXXZ)
C:\Users\obinyans\Documents\Visual Studio 2010\Projects\test\test\Challenge 1.obj
and below is a copy of my code:
下面是我的代码的副本:
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
void storeinfo() ;
void showinfo() ;
class user
{
string firstname, lastname, currentteam, position, status ;
int age ;
public:
user();
user(string, string, string, string, string, int) ;
void setFirstName(string fname)
{firstname = fname;}
void setLastName(string lname)
{lastname = lname;}
void setCurrentTeam(string cteam)
{currentteam = cteam;}
void setPosition(string pos)
{position = pos;}
void setStatus(string stat)
{status = stat;}
void setAge(int _age)
{age = _age;}
string getFirstName()
{return firstname ;}
string getLastName()
{return lastname ;}
string getCurrentTeam()
{return currentteam ;}
string getPosition()
{return position ;}
string getStatus()
{return status ;}
int getAge()
{return age ;}
};
user player[20] ;
int main()
{
;
int menu ;
cout << "MENU" << "\n" ;
cout << "\n 1. Store Player Information" ;
cout << "\n 2. Show Player Informaton" ;
cout << "\n 0. Exit" ;
cin >> menu ;
if (menu = 1)
{
storeinfo() ;
}
else if (menu = 2)
{
showinfo() ;
}
else if (menu = 0)
{
return 0;
}
cin.get() ;
return 0 ;
}
void storeinfo()
{
string firstname ;
string lastname ;
string currentteam ;
string position;
string status ;
int age ;
for (int i=0; i < 3; i++)
{
cout << "Enter First Name : " ; cin >> firstname ;
player[i].setFirstName(firstname) ;
cout << "Enter Last Name : " ; cin >> lastname ;
player[i].setLastName(lastname) ;
cout << "Enter Player's Age : " ;cin >> age;
player[i].setAge(age) ;
cout << "Enter Current Team : " ; cin >> currentteam ;
player[i].setCurrentTeam(currentteam) ;
cout << "Enter Position : " ; cin >> position ;
player[i].setPosition(position) ;
cout << "Enter Status : " ; cin >> status ;
player[i].setStatus(status) ;
}
}
void showinfo()
{
for (int i=0; i < 3; i++)
{
cout << "First Name : " << player[i].getFirstName() << " " << "Last Name : " << player[i].getLastName() <<
" " << "Age : " << player[i].getAge() << " " << "Current Team : " << player[i].getCurrentTeam() <<
" " << "Position : " << player[i].getPosition() << " " << "Status : " << player[i].getStatus() ;
}
}
Thanks for any help.
谢谢你的帮助。
回答by Mr.C64
You didn't provide an implementationfor your constructors:
您没有为构造函数提供实现:
class user
{
....
public:
user();
user(string, string, string, string, string, int);
....
};
Try adding bodies for both of them:
尝试为它们添加实体:
class user
{
....
public:
// Default constructor
user()
// std::string's are default constructed to empty strings.
// You may want to set a value for age data member.
: _age(0)
{
}
// Constructor with initialization parameters
user(string first_name, string last_name, string current_team,
string position, string status, int age)
: _first_name(move(first_name)),
_last_name(move(last_name)),
_current_team(move(current_team)),
_position(move(position)),
_status(move(status)),
_age(age)
{
}
....
};
Note that it is convenient to give some prefix to data members, to distinguish them from parameters. Some conventions are prefixing with _
or m_
(e.g. name
is a parameter, _name
or m_name
is a data member).
请注意,为数据成员提供一些前缀很方便,以将它们与参数区分开来。一些约定以_
or为前缀m_
(例如name
是一个参数,_name
或者m_name
是一个数据成员)。
Note also that in C++11 (and from your error code I read that you're using VS2010, which has some form of move semantics available), when you pass a class that is movable and is cheap to move, and you have to make a local copy (like when setting data members), you can pass by value and std::move
from the value, e.g.
还要注意,在 C++11 中(从你的错误代码中我读到你正在使用 VS2010,它有某种形式的移动语义可用),当你传递一个可移动且移动成本低的类时,你有要制作本地副本(如设置数据成员时),您可以通过值和std::move
从值传递,例如
void set_first_name(string first_name)
{
_first_name = move(first_name);
}
Note also that getters tend to be const
:
另请注意,吸气剂往往是const
:
const string& get_first_name() const
{
return _first_name;
}
回答by Foggzie
It looks like you haven't defined your constructors for the user
class.
看起来您还没有为user
类定义构造函数。
Try changing:
尝试改变:
user();
user(string, string, string, string, string, int) ;
to:
到:
user() {}
user(string, string, string, string, string, int) {}
This wont cause the constructors to do anything but at least they'll exist now. I'm guessing, eventually, you'd want your second constructor to look like this:
这不会导致构造函数做任何事情,但至少它们现在会存在。我猜,最终,你会希望你的第二个构造函数看起来像这样:
user(string fname, string lname, string cteam, string pos, string stat, int age)
{
setFirstName(fname);
setLastName(lname);
setCurrentTeam(cteam);
setPosition(pos);
setStatus(stat);
setAge(age);
}