vendredi 21 février 2020

undefined reference to error c++ ; read in file error

All I need to do is to read the spieler.txt below in my main.cpp so I can test out some of the functions I wrote.

I have a mini spieler.txt file like this:

Stephen Stoudemire Power_Forward 21 16.6662
Vince McHale Small_Forward 69 19.61
Jimmy Stockton Small_Forward 52 18.2193
Steve Quarterman Center 78 26.5106
Pau Fisher Point_Guard 20 17.2687
Jerry Aldridge Point_Guard 44 26.87
Pau Gilmore OrPoint_Guard 34 27.8967
Dennis O'Neal Shooting_Guard 41 16.3044
Paul Aldridge Shooting_Guard 70 17.158
Kobe Cheeks Shooting_Guard 20 13.5169

and in my main.cpp I have trying to read my spieler.txt

#include<iostream>
#include<unordered_map>
#include<fstream>
#include<stdexcept>
#include<algorithm>
#include<numeric>
#include<iterator>
#include<set>
#include"vector.h"
#include"spieler.h"

int main() {

  vector<Spieler> v;

    ifstream input{"spieler.txt"};
    Spieler f;
    while(f.read(input)) {
    //  cout<<f;
        v.push_back(f);
    }
return 0;
}

But it keeps throwing me the error like:

/tmp/ccnT7yxX.o: In function `main':
main.cpp:(.text+0x23c): undefined reference to `Spieler::Spieler(std::string, Positionen, int, double)'
main.cpp:(.text+0x273): undefined reference to `Spieler::read(std::istream&)'
main.cpp:(.text+0x2bb): undefined reference to `Spieler::~Spieler()'
main.cpp:(.text+0x3cc): undefined reference to `Spieler::~Spieler()'
/tmp/ccnT7yxX.o: In function `Spieler::Spieler(Spieler const&)':
main.cpp:(.text.ZN7SpielerC2ERKS[ZN7SpielerC5ERKS]+0x11): undefined reference to `vtable for Spieler'
collect2: error: ld returned 1 exit status

I wonder what the problem is?

If someone is interested in my spieler.h and spieler.cpp it looks like this:

spieler.h:

#ifndef SPIELER_H
#define SPIELER_H

#include<iostream>
#include<unordered_map>
#include<stdexcept>
#include<algorithm>
#include<numeric>
#include<iterator>
#include<set>
#include<vector>
#include"vector.h"
using namespace std;

enum class Positionen{Point_Guard, Shooting_Guard, Small_Forward, Power_Forward,Center};
const vector<string> pnamen{"PG", "SG", "SF", "PF", "C"};

class Spieler{
    string name;
//  string team;
    Positionen position;
    int groesse;
    double faehigkeiten;
//  vector<double> faehigkeiten;

    public:
        Spieler(string = "Blake Griffin", Positionen=Positionen::Power_Forward, int = 208, double = 19.8);
        virtual ~Spieler();
        string get_name() const;
    //  string get_team() const;
        Positionen get_position() const;
        int get_groesse() const;
        const double get_faehigkeiten() const;
//      const vector<double>& get_faehigkeiten() const;
        friend ostream& operator<<(ostream& o, const Spieler& h);
    //  void str_toupper(string str);
    //  double summe_faehigkeiten() const;
        void wachsen();
        bool operator<(const Spieler& s) const;
        bool operator>(const Spieler& s) const;
        bool operator==(const Spieler& s) const;
        ostream& write(ostream&) const;
        istream& read(istream&);
};
#endif

and my spieler.cpp looks like this:

#include<iostream>
#include<unordered_map>
#include<stdexcept>
#include<algorithm>
#include<numeric>
#include<iterator>
#include<set>
#include<vector>
#include"spieler.h"
#include"vector.h"

using namespace std;

//Spieler::Spieler(string name, Positionen position, int groesse, vector<double> faehigkeiten):name{name}, position{position}, groesse{groesse}, faehigkeiten{faehigkeiten}{}


Spieler::Spieler(string name, Positionen position, int groesse, double faehigkeiten):name{name}, position{position}, groesse{groesse}, faehigkeiten{faehigkeiten}{}


Spieler::~Spieler(){}

string Spieler::get_name() const{return name;}

//string Spieler::get_team() const{return team;}

int Spieler::get_groesse() const{return groesse;}

const double Spieler::get_faehigkeiten() const{return faehigkeiten;}
//const vector<double>& Spieler::get_faehigkeiten() const{return faehigkeiten;}
Positionen Spieler:: get_position() const{return position;}

/*
double Spieler::summe_faehigkeiten() const{
    return accumulate(faehigkeiten.begin(), faehigkeiten.end(), 0.0, [] (const double& sum, const double& x) {return sum+x;});
}
*/
ostream& operator<<(ostream& o, const Spieler& h) {
    o<<"[" << h.name << ", " <<h.team << "," <<pnamen[static_cast<size_t> (h.position)] <<", " <<h.groesse <<", {";
    bool first(true);
/*
    for(const auto& x: h.faehigkeiten){
        if(first)
            first=false;
        else
            o<<", ";
        o<<x;
        }*/
    return o<<"}]";

}




bool Spieler::operator<(const Spieler& s) const{
    return name<s.name;
}

bool Spieler::operator> (const Spieler& s) const{

    return name>s.name;
}

bool Spieler::operator==(const Spieler& s) const{
    return name == s.name;
}

ostream& Spieler::write(ostream& o) const{
    o<<name <<" "<<team <<" " <<static_cast<size_t> (position)<<" " <<groesse;
    for(const auto& x:faehigkeiten)
        o<< " " << x;
    return o;
}

istream& Spieler::read(istream& i ){
    string s;
    if(!(i >>s))
        return i;
    string t;
    i >> t;
    name = s + " " + t;
    i >> team;
    int j;
    i >> j;
    position = static_cast<Positionen>(j);
    i>>groesse;
    faehigkeiten.clear();
    double d;
    i >> d;
    faehigkeiten.push_back(d);
    i >>d;
    faehigkeiten.push_back(d);
    i >> d;
    faehigkeiten.push_back(d);
    return i;
}

void Spieler::wachsen() {
    groesse+= 10;
}


Aucun commentaire:

Enregistrer un commentaire