[C++] Undefined reference to funzione()

di Anonimizzato12310 il
13 risposte
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

  • Nel '. h' devi scrivere

    extern void ... ;
  • migliorabile ha scritto:


    nel '. h' devi scrivere

    extern void ... ;
    fatto, ma niente da fare. devo aggiungere il prototipo anche nel main.cpp?
  • Hai usato un progetto? Come hai compilato il file CreatePlayer.cpp ? Come lo hai linkato?
  • 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?
  • Ci deve essere qualche problema nell'impostazione del progetto.

    Se riesci a farci scaricare uno zip completo di tutto, si può dare un'occhiata
  • 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
  • Nelle Proprietà del file createPlayer.cpp, apri il tab Build e aggiungi la spunta ai target

    Debug
    Release

    altrimenti il file non viene considerato.
  • 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?
  • In realtà è automatico. Chissà perché per quel file non c'era ...
  • 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
  • @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 ???)
  • @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!)
  • 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