我一直收到错误LNK2019,似乎无法弄清楚如何解决它

时间:2013-11-14 19:36:56

标签: c++ arrays c++11 enums lnk2019

我正在为我的编程类工作,当我尝试编译它时,我不断收到构建错误LNK2019。我已经尝试过咨询另一位CPS专业,他不太清楚我为什么一直收到这个错误。

// File: Asgn7_Skel.cpp
// CPS 150/Fall 2013 Assignment 7 Skeleton
// Modified from Gaddis Program 8-32 to satisfy the assignment
// requirements.
// Skeleton by: Tamisra H. Sanyal
// Completed by: Kyle Abel
// This program lets the user play a game of rock, paper, scissors
// with the computer. The computer's choices are randomly generated.
// Total 10 rounds are played. 
// Change the NumRounds constant to play a different number of rounds

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
#include <string>
#include <array>
using namespace std;

// enumerations of choices and outcomes
enum Choices {Rock, Paper, Scissors, Last};
enum Outcomes {ComputerWin, PlayerWin, Tie,};

// Data for one round
struct GameData 
{
    Choices computerChoice;
    Choices playerChoice;
    Outcomes result;
}; // end struct

const int NumRounds(10);    // number of rounds to play
const int ArraySize(NumRounds); // we will not use index 0

typedef array<GameData, ArraySize> DataStore;

// These constant arrays are used to translate enumeration constants to
// readable descriptions (see line 9 in textbook's program)
const array<string, 3> ChoiceNames = {"Rock", "Paper", "Scissors"};
const array<string, 3> OutcomeNames = {"Computer win", "Player win", "Tie"};
array<int, 3> ResultsTalley = {};

// Function prototypes
void getPlayerChoice(Choices & choice);
Outcomes getRoundResult(const Choices computerChoice, const Choices playerChoice);

void showRoundResult(const Choices computerChoice, const Choices playerChoice,
const Outcomes roundResult);

void showGameResults(const DataStore & results);

int main() 
{
    Choices computerChoice, playerChoice;
    Outcomes roundResult;
    int computerPoints = 0, playerPoints = 0;  // Point accumulators
    DataStore gameResults = {};

    srand(time(NULL));  // Give the random generator

    int counter;       // a seed to start with 
    int pl_choice;

    cout << "CPS 150 Assignment 7 by Kyle Abel\n\n";
    cout << "Let's play Rock-Paper-Scissors!\n";
    cout << "We will play " << NumRounds << " rounds.\n\n";

    // TODO: Add main function code here
    for (counter = 0; counter < NumRounds; counter++)
    {
        computerChoice = static_cast<Choices>(rand() % 3);  
        getPlayerChoice(playerChoice);  
        getRoundResult(computerChoice, playerChoice);   
        showRoundResult(computerChoice, playerChoice, roundResult);

        if (Tie)
        {
            return 0;
        }
        else if (ComputerWin)
        {
            computerPoints++;
        }
        else 
            playerPoints++;
    } // end for

    cout << "\nCPS 150 Assignment 7 complete\n\n";
    return 0;
} // end main

void showGameResults(const DataStore & results) 
{
    cout << "Game results\n";
    cout << "============\n";
    cout << right << setw(5) << "Round" << ' ' 
        << left << setw(14) << "Player choice"
        << setw(16) << "Computer choice" 
        << setw(13) <<"Round result" << endl;
    cout << right << setw(5) << "-----" << ' ' 
        << left << setw(14) << "-------------"
        << setw(16) << "---------------" 
        << setw(13) <<"------------" << endl;

    for (int k(1); k < results.size(); k++) 
    {
        cout << right << setw(5) << k << ' ' << left
            << setw(14) << ChoiceNames[results[k].playerChoice] 
            << setw(16) << ChoiceNames[results[k].computerChoice] 
            << setw(13) << OutcomeNames[results[k].result] << endl;
    } // end for

    cout << endl;
} // end showGameResults

void getPlayerChoice(Choices playerChoice, int PChoice) 
{
    cout << "Enter your choice, 1 for Rock, 2 for Paper, or 3 for Scissors";
    cin >> PChoice;

    if (PChoice != 1 || PChoice != 2 || PChoice != 3) 
    {
        cout << "Please Enter a Valid # 1-3" << "\n\n";
        cin >> PChoice;
    }
    else if (PChoice = 1) 
    {
        PChoice--;
        static_cast<Choices>(PChoice);          
    }
    else if (PChoice = 2) 
    {
        PChoice--;
        static_cast<Choices>(PChoice);      
    }
    else 
    {
        PChoice--;
        static_cast<Choices>(PChoice);       
    }
}

Outcomes getRoundResult(const Choices computerChoice, const Choices playerChoice)
{
    if (computerChoice == playerChoice) 
    {
        return Tie;
    }
    else if ((playerChoice == 1 && computerChoice == 2) ||
            (playerChoice == 2 && computerChoice == 3) ||
            (playerChoice == 3 && computerChoice == 1) )
    {
        return ComputerWin;
    }
    else 
    {
        return PlayerWin;
    }
}

void showRoundResult(const Choices computerChoice, const Choices playerChoice, const Outcomes roundResult)
{ 
    if (Outcomes(Tie))
    {
       cout << "we have tied!";
    }
    else if (Outcomes(ComputerWin))
    {
       cout << "I chose " << ChoiceNames[computerChoice] << ", so I win the game! "
            << ChoiceNames[computerChoice] << " beats " << ChoiceNames[playerChoice]
            << ". \n\n";                
    }
    else if (Outcomes(PlayerWin))
    {
       cout << "I chose " << ChoiceNames[computerChoice] << ", so you won!! "
            << ChoiceNames[playerChoice] << " beats " << ChoiceNames[computerChoice]
            << ". \n\n";
    }
}

这些是我每次尝试构建项目时都会遇到的错误:

1>------ Build started: Project: ConsoleApplication15, Configuration: Debug Win32 ------
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl     getPlayerChoice(enum Choices &)" (?getPlayerChoice@@YAXAAW4Choices@@@Z) referenced in   function _main
1>C:\Users\Kyle\documents\visual studio 2012\Projects\ConsoleApplication15\Debug\ConsoleApplication15.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

非常感谢有关如何解决此问题的任何指导!

3 个答案:

答案 0 :(得分:4)

问题正在发生,因为您的函数原型与函数定义不同。你有原型:

void getPlayerChoice(Choices & choice);

但你对该功能的定义是:

void getPlayerChoice(Choices playerChoice, int PChoice)

要解决此问题,函数原型和定义必须相同。

答案 1 :(得分:1)

嗯 - 您没有定义getPlayerChoice(Choices & choice)函数,因此编译器会给您一个错误。

代码中getPlayerChoice(Choices & choice)声明void getPlayerChoice(Choices playerChoice, int PChoice)定义。那不一样。你调用main中的第一个,虽然它没有定义,因为你定义了它的不同版本。

答案 2 :(得分:0)

我会重写你的getPlayerChoice函数来使用循环,因为如果用户输入两个无效的选项,它将会流过。这就是我在想的。

void getPlayerChoice(Choices& playerChoice, int PChoice) {
    cout << "Enter your choice, 1 for Rock, 2 for Paper, or 3 for Scissors";
    cin >> PChoice;

    while (PChoice != 1 || PChoice != 2 || PChoice != 3) {
        cout << "Please Enter a Valid # 1-3" << "\n\n";
        cin >> PChoice;
    }

    //Now that we're sure it's either 1 2 or 3, we can alter the rest of the code a bit
    PChoice--;            //Instead of once in each branch
    playerChoice = static_cast<Choices>(PChoice); //Why cast it without assigning it?
}

我只是想到了另一个想法,而且,我担心我可能已经做了太多的任务,我不会包含这些代码,但是如果你弄清楚这一点,你会给你的教授留下深刻的印象(哦,太棒了) ,现在我要让Heinz Doofenschmirtz的声音在我的头脑中唱“我必须给我的教授留下深刻的印象”。可以通过将用户的选择转换为整数,减去计算机转换为整数的选择,然后在结果上使用模数3来确定获胜者。 0 =领带,1 =人,2 = PC。