1

重複の可能性:
未定義の参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればよいですか?

大学の課題をコーディングしようとしていますが、コンパイルに問題があるようです。エラーについてGoogle検索を実行しましたが、確認した修正がコードで機能しません。よろしくお願いします。

以下はエラーコードです:

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

以下は私のコードのコピーです:

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

助けてくれてありがとう。

4

2 に答える 2

5

コンストラクターの実装を提供しませんでした:

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

両方のボディを追加してみてください:

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、パラメーター、_nameまたはm_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;
}
于 2013-01-21T23:44:11.547 に答える
2

userクラスのコンストラクターを定義していないようです。

変更してみてください:

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

に:

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

これにより、コンストラクターは何もしなくなりますが、少なくとも現在は存在します。最終的には、2 番目のコンストラクターを次のようにする必要があると思います。

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);
}
于 2013-01-21T23:22:08.207 に答える