2013-01-21 64 views
1

可能重复:
What is an undefined reference/unresolved external symbol error and how do I fix it?错误LNK2019:无法解析的外部符号 “公用:__thiscall用户::用户(无效)”(?? 0user @@ QAE @ XZ)中函数引用 “...”

我想编写一个大学分配,而且似乎有问题的编译,我已经做上的错误,我已经看到了不与我的代码工作修复了谷歌搜索。我很感谢你的帮助。

下面是错误代码:

Error 1 error LNK2019: unresolved external symbol "public: __thiscall user::user(void)" ([email protected]@[email protected]) 
referenced in function "void __cdecl `dynamic initializer for 'player''(void)" ([email protected]@YAXXZ) 
C:\Users\obinyans\Documents\Visual Studio 2010\Projects\test\test\Challenge 1.obj 

以下是我的代码的副本:

#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() ; 
    } 
} 

感谢您的帮助。

+0

这都是你的代码?如果是,您错过班级用户成员功能的定义 – billz

+0

阅读链接错误。答案就在那里。 – mfontanini

+0

“修复我的代码PLZ”的两个upvotes –

回答

2

看起来您还没有为user类定义构造函数。

尝试改变:

user(); 
user(string, string, string, string, string, int) ; 

到:

user() {} 
user(string, string, string, string, string, int) {} 

这不会导致构造做任何事情,但至少他们现在会存在。我猜测,最终,你会希望你的第二个构造函数是这样的:对于

class user 
{ 
.... 
public: 
    user(); 
    user(string, string, string, string, string, int); 
.... 
}; 

尝试增加机构:

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); 
} 
+0

我会使用初始化列表语法在构造函数中的数据成员初始化,而不是在构造函数体内使用setter。此外,要么使用C++ 98风格的传递参数使用'const&',要么使用C++ 11传递值并从值风格移动。 –

5

您没有为你的构造提供实施他们两个:

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) 
    { 
    } 

.... 
}; 

注意,可以很方便地给一些前缀数据成员,以区分它们与参数。一些约定前缀为_m_(例如,name是参数,_namem_name是数据成员)。

请注意,在C++ 11中(并且从错误代码中,我知道您使用VS2010,它具有某种可用的移动语义形式),当您传递一个可移动且移动便宜的类时,并且您必须创建一个本地副本(例如设置数据成员时),则可以通过值传递值,例如std::move

void set_first_name(string first_name) 
{ 
    _first_name = move(first_name); 
} 

还要注意的是干将往往是const

const string& get_first_name() const 
{ 
    return _first_name; 
} 
相关问题