[C++] Undefined reference to funzione()

di il
13 risposte

[C++] Undefined reference to funzione()

Ciao,
sto facendo un test per la creazione di 2 giocatori in un programmino che sto scrivendo.
vi posto il sorgente.

main.cpp
#include <iostream>
#include "createPlayer.h"

int main()
{
    createPlayer();
}
Player.h
#ifndef PLAYER_H
#define PLAYER_H

#include <iostream>

class Player
{
    public:
        Player(int ap);
        Player(int h, int s, int ap);

        void setName(std::string n);
        void setHealth(int h);
        void setShield(int s);
        void setAttackPower(int ap);

        std::string getName() const;
        int getHealth() const;
        int getShield() const;
        int getAttackPower() const;

    protected:
        std::string name;
        int health;
        int shield;
        int attackPower;
};

#endif // PLAYER_H
Player.cpp
#include "..\include\Player.h"
#include <string>

Player::Player(int ap)
: health(100), shield(100), attackPower(ap)
{
    std::cout << "Enter player's name: ";
    getline(std::cin, name);
}

Player::Player(int h, int s, int ap)
: health(h), shield(s), attackPower(ap)
{
    std::cout << "Enter player's name: ";
    getline(std::cin, name);
}

void Player::setName(std::string n) { name.assign(n); }
void Player::setHealth(int h) { health = h; }
void Player::setShield(int s) { shield = s; }
void Player::setAttackPower(int ap) { attackPower = ap; }

std::string Player::getName() const { return name; }
int Player::getHealth() const { return health; }
int Player::getShield() const { return shield; }
int Player::getAttackPower() const { return attackPower; }
createPlayer.h
#ifndef CREATEPLAYER_H
#define CREATEPLAYER_H

void createPlayer();

#endif // CREATEPLAYER_H
createPlayer.cpp
#include <iostream>
#include <fstream>
#include "createPlayer.h"
#include "include\Player.h"

void createPlayer()
{
    Player po(50);
    int counter = 0;
    std::ofstream toFile("save.txt");

    while (counter++ < 2)
    {
        toFile << po.getName() << po.getHealth() << po.getShield;
    }
il problema è nel main.cpp.
undefined reference to createPlayer()...
come mai? ho incluso l'header...

13 Risposte

  • Re: [C++] Undefined reference to funzione()

    Nel '. h' devi scrivere

    extern void ... ;
  • Re: [C++] Undefined reference to funzione()

    migliorabile ha scritto:


    nel '. h' devi scrivere

    extern void ... ;
    fatto, ma niente da fare. devo aggiungere il prototipo anche nel main.cpp?
  • Re: [C++] Undefined reference to funzione()

    Hai usato un progetto? Come hai compilato il file CreatePlayer.cpp ? Come lo hai linkato?
  • Re: [C++] Undefined reference to funzione()

    oregon ha scritto:


    Hai usato un progetto? Come hai compilato il file CreatePlayer.cpp ? Come lo hai linkato?
    sì, è un progetto..
    qui c'è la struttura delle cartelle


    ho selezionato nella build option di code blocks il main.cpp come target del compilatore e poi da lì dovrebbe fare tutto in automatico, almeno credo...

    avrei dovuto fare qualche altro passaggio?
  • Re: [C++] Undefined reference to funzione()

    Ci deve essere qualche problema nell'impostazione del progetto.

    Se riesci a farci scaricare uno zip completo di tutto, si può dare un'occhiata
  • Re: [C++] Undefined reference to funzione()

    oregon ha scritto:


    Ci deve essere qualche problema nell'impostazione del progetto.

    Se riesci a farci scaricare uno zip completo di tutto, si può dare un'occhiata
    ecco qua
  • Re: [C++] Undefined reference to funzione()

    Nelle Proprietà del file createPlayer.cpp, apri il tab Build e aggiungi la spunta ai target

    Debug
    Release

    altrimenti il file non viene considerato.
  • Re: [C++] Undefined reference to funzione()

    oregon ha scritto:


    Nelle Proprietà del file createPlayer.cpp, apri il tab Build e aggiungi la spunta ai target

    Debug
    Release

    altrimenti il file non viene considerato.
    grazie, ora funziona.
    quindi, ogni nuovo file .cpp che creo deve essere aggiunto ai target? non c'è un modo per renderlo automatico?
  • Re: [C++] Undefined reference to funzione()

    In realtà è automatico. Chissà perché per quel file non c'era ...
  • Re: [C++] Undefined reference to funzione()

    L'errore consiste che nel file createplayer.h non è definita la funzione
    come potrai ben vedere nel file createplayer.h tu usi la funzione invece di crearla.
    createPlayer.h
    Codice: Seleziona tutto
        #ifndef CREATEPLAYER_H
        #define CREATEPLAYER_H
        void createPlayer(); // qui definisci solo il prototipo ma non la funzione
        #endif // CREATEPLAYER_H
    questo e invece il file createplayer.cpp
    #include <iostream>
    #include <fstream>
    #include "createPlayer.h"
    #include "include\Player.h"
    void createPlayer()
    {
        Player po(50);
        int counter = 0;
        std::ofstream toFile("save.txt");
    
        while (counter++ < 2)
        {
            toFile << po.getName() << po.getHealth() << po.getShield;
        }
    adesso le soluzioni sono 2
    1) inserisci nel file createplayer.h una bella include al file createplayer.cpp
    2) ti riscrivi il file createplayer.cpp nel file createplayer.h
    a te la scelta
  • Re: [C++] Undefined reference to funzione()

    @smalldragon ... non seguo per niente il tuo discorso. Il problema (risolto) era nelle impostazioni di build del createPlayer.cpp. Tutto quello che hai scritto non c'entra nulla, anzi, è sbagliato (scrivere il .cpp nel .h ???)
  • Re: [C++] Undefined reference to funzione()

    @oregon
    se avresti visto bene nel file .h
    non c'era la definizione della funfuone ma c'era la ifndef ... e il prototipo di funzione.
    ma mancava la definizione della funzione.
    adesso se tu la inserisci tramite la builder aggiungendo il file non fai che rallentare l'esecuzione del programma rendendo quasi inutile il .h che gia avevi inserito in precedenza.
    inoltre se metteva la include a fstream ad inizio modulo avrebbe risparmita di inserirla negli altri moduli guadagnando in velocità di esecuzione nonche in linee di codice ottimizzando il programma.
    se invece inserisci la funzione direttamente nel .h l'ottimizzi e dai anche un senso al .h!
    che cosi come era non aveva un gran senso. (mi sembra strano che non te ne fossi accorto!)
  • Re: [C++] Undefined reference to funzione()

    smalldragon ha scritto:


    @oregon
    se avresti visto bene
    A parte l' "avessi" ...
    nel file .h non c'era la definizione della funfuone ma c'era la ifndef ... e il prototipo di funzione. ma mancava la definizione della funzione.
    nei file include (i .h) deve esserci solo il prototipo e non l'implementazione della funzione (è una regola basilare del C/C++). L'implementazione va in un corrispondente file .c/.cpp, esattamente come è nel progetto in questione.
    adesso se tu la inserisci tramite la builder aggiungendo il file non fai che rallentare l'esecuzione del programma rendendo quasi inutile il .h che gia avevi inserito in precedenza.
    Questo non ha senso ... ma dove hai imparato a programmare in C ?
    inoltre se metteva la include a fstream ad inizio modulo avrebbe risparmita di inserirla negli altri moduli guadagnando in velocità di esecuzione nonche in linee di codice ottimizzando il programma.
    Ma cosa c'entra ? Che dici ? La velocità di esecuzione non dipende da questo, semmai (ma non è questo il caso) la velocità di compilazione ... scusa, ma ripeto che non hai molta esperienza con il C/C++ ... evita certe affermazioni.

    Come avrai letto, il problema si è risolto esattamente come doveva essere ...
Devi accedere o registrarti per scrivere nel forum
13 risposte