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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 18:21:06  来源:igfitidea点击:

Error LNK2019: unresolved external symbol "public: __thiscall user::user(void)" (??0user@@QAE@XZ) referenced in function "..."

c++linker

提问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. nameis a parameter, _nameor m_nameis 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::movefrom 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 userclass.

看起来您还没有为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);
}