c++ LNK2001: simbolo esterno non risolto problema

Saluti.

Ho cercato una soluzione, ma penso che questo problema è un codice personale specifico, quindi il mio postare qui.

Mi arriva dritto al punto.

Nel mio principale ho due oggetti.

Computer *computer = new Computer();
Player *player = new Player();

Nel computer di classe, nell’intestazione ho il seguente:

  private:

Strategy *strategy;
int winningPosition;
int twoInRow;
int counter;
int makeTwo;

Quindi in Computer.cpp:

Computer::Computer(char token, bool hasTurn)
{
    m_token = token;
    m_hasTurn = hasTurn;
    strategy = new Strategy();
}

int Computer::getMove(const char (&board)[9])
{
    twoInRow = strategy->checkTwoInRow(board);
    counter = strategy->counter(board);
    makeTwo = strategy->makeTwo(board);

    if(twoInRow != 0)
    {
        return twoInRow - 1;
    } else if(counter != 0) {
        return counter - 1;
    } else if(makeTwo != 0) {
        return makeTwo - 1;
    } else {
        return 0;
    }
}

A questo punto penso che il problema si pone.

I metodi chiamati dalla classe di Strategia di tutti richiedono conoscenza del consiglio così:

int checkTwoInRow(const char (&board)[9]);
int counter(const char (&board)[9]);
int makeTwo(const char (&board)[9]);

I problemi im ottenendo, unabling loro di compilare:

Error   1   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::makeTwo(char const (&)[9])" (?[email protected]@@[email protected]) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?[email protected]@@[email protected])    C:\CPP\TTT\Computer.obj tictactoeCPP

Error   2   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::counter(char const (&)[9])" (?[email protected]@@[email protected]) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?[email protected]@@[email protected])    C:\CPP\TTT\Computer.obj tictactoeCPP

Error   3   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::checkTwoInRow(char const (&)[9])" (?[email protected]@@[email protected]) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?[email protected]@@[email protected])    C:\CPP\TTT\Computer.obj tictactoeCPP

Come c++ noob, non ho assolutamente idea di come o perché questo problema è causato. Io penso che abbia a che fare qualcosa con la creazione di istanze di Strategia in classe computer, o con il parametro dato dal computer per la strategia di chiamate di metodo.

Qualcuno può spiegare PERCHÉ questo errore è in corso, io non riesco a capire l’errore a tutti.
E anche come risolvere/prevenire questo?

MODIFICA*

Ho appena ricevuto una richiesta di condividere la Strategia di classe:

Strategia.h:

    #pragma once
class Strategy
{
public:
    Strategy(void);
    ~Strategy(void);

    int checkTwoInRow(const char (&board)[9]);
    int counter(const char (&board)[9]);
    int makeTwo(const char (&board)[9]);
};

Classe definita di questi metodi, io non li posto perché sono abbastanza a lungo.

  • Ci mostrano la Strategia di classe e discendente dell’, penso che il tuo problema di vita.
  • Di fare. Grazie per l’avviso.
  • Anche provato a cambiare #pragma once a #ifndef STRATEGY_H e #define STRATEGY_H (anche se io non capisco davvero questo ancora, questo è solo quello che io uso in altre intestazioni) e non cambia nulla ._.
InformationsquelleAutor Joey Roosing | 2011-04-13



2 Replies
  1. 8

    Questo è un errore di collegamento e non ha nulla a che fare con le istanze o i parametri.

    Non hai fornito il linker con le definizioni per quelle funzioni. Se state definite in Strategy.cpp è necessario compilare il codice e aggiungere un argomento per il linker. Come farlo dipende interamente da ciò che strumenti utilizzi per costruire il vostro programma.

    Se si utilizza Visual Studio (o di qualsiasi altro IDE), si dovrebbe prendere cura di esso automaticamente una volta che hai aggiunto Strategy.cpp per il vostro progetto.

    O hai forse definirli come questo:

    int checkTwoInRow(const char (&board)[9])
    {
       //Do something with board the wrong way
    }

    invece di come questo:

    int Strategy::checkTwoInRow(const char (&board)[9])
    {
       //Do something with board the right way
    }

    Non definire una Strategia funzione membro, si definisce una funzione globale.

    • Mi sono definite utilizzando la seconda versione: Strategia::checkTwoInRow. Grazie per la tua spiegazione. Il problema è più chiaro 🙂 Grazie a te. Se non vi dispiace, vorrei chiederti una cosa però. È che cosa #ifndef e #define fa?
    • Ok trovato il problema. Ero abbastanza stupido, ho infatti usato la tua prima versione. Si è dimenticato di usare la Strategia::… anche dopo beign sicuro che ho fatto, perché io faccio sempre su file di classe… ma questa volta ho solo puramente dimenticato. Grazie mille.
    • Roosing : Che è quello che mi è stato riferito da ‘accidentalmente definisce come funzioni libere’. :-]
  2. 2

    L’errore è semplicemente affermando che è stata dichiarata, ma non definito, le funzioni membro Strategy::makeTwo, Strategy::counter, e Strategy::checkTwoInRow. Sei sicuro che le hanno attuate (in un file di origine che in realtà è in fase di compilazione) e che non avete accidentalmente li definiscono funzioni gratis?

    • In realtà, non ho definito a tutti nell’intestazione. necessità di definire la Strategia::contatore nel Computer di intestazione?
    • Roosing : Essere certi di capire la differenza tra una dichiarazione e una definizione. Hai mostrato le loro dichiarazioni in originale di domanda (che presumibilmente è un estratto class Strategy), ma dove sono le funzioni membro effettivamente implementato?
    • Essi sono implementati nella Strategia di classe e tutti e tre li restituiscono un valore integer. E sì, hai ragione. Ho mescolato defiinition e dichiarazione. Mi dispiace. i metodi sono definiti e dichiarati nella Strategia di classe e ho bisogno di accedere al computer in classe

Lascia un commento