web-dev-qa-db-fra.com

Référence G ++ non définie à class :: function

Je suis finalement assez désespéré. Donc, dans ma classe c ++, on nous a demandé d'utiliser des classes. Nous aurions le fichier d'en-tête déclarer la classe et les fonctions tandis qu'un fichier .cpp distinct implémente le it. Les choses devraient fonctionner, mais elles ne le sont pas et aucune solution sur le Web ne semble fonctionner pour moi. J'utilise le compilateur G ++ sur linux pour cela, et cela ne semble pas fonctionner sur les IDE ou la ligne de commande normale.

L'erreur que je reçois dans mon TBook.h est la suivante:

/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccxqI6An.o: In function `TBook::TBook()':
TBook.cpp:(.text+0x3b): undefined reference to `Telephone::Telephone()'
TBook.cpp:(.text+0x100): undefined reference to `Telephone::Telephone()'
TBook.cpp:(.text+0x132): undefined reference to `Telephone::allNum(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
TBook.cpp:(.text+0x182): undefined reference to `Telephone::~Telephone()'
TBook.cpp:(.text+0x191): undefined reference to `Telephone::~Telephone()'
TBook.cpp:(.text+0x2b3): undefined reference to `Telephone::~Telephone()'
TBook.cpp:(.text+0x2e6): undefined reference to `Telephone::~Telephone()'
TBook.cpp:(.text+0x2fa): undefined reference to `Telephone::~Telephone()'
/tmp/ccxqI6An.o:TBook.cpp:(.text+0x370): more undefined references to `Telephone::~Telephone()' follow
/tmp/ccxqI6An.o: In function `TBook::write()':
TBook.cpp:(.text+0x4e1): undefined reference to `Telephone::getNumber()'
TBook.cpp:(.text+0x506): undefined reference to `Telephone::getAreaCode()'
TBook.cpp:(.text+0x53a): undefined reference to `Telephone::getName()'
/tmp/ccxqI6An.o: In function `TBook::lookup(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
TBook.cpp:(.text+0x6d4): undefined reference to `Telephone::getName()'
TBook.cpp:(.text+0x79e): undefined reference to `Telephone::Telephone(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/tmp/ccxqI6An.o: In function `TBook::print()':
TBook.cpp:(.text+0x880): undefined reference to `Telephone::getName()'
TBook.cpp:(.text+0x8e0): undefined reference to `Telephone::getNumber()'
TBook.cpp:(.text+0x8ff): undefined reference to `Telephone::getAreaCode()'
collect2: ld returned 1 exit status
[Finished in 0.3s with exit code 1]

Je n'aime pas du tout que le fichier ne reçoive aucune des méthodes de la classe Telephone. Voici à quoi ressemble le code pour TBook.h:

#ifndef TBOOK_H
#define TBOOK_H

#include "Telephone.h"

class TBook{
private:
    Telephone rolodex[10]; 
    int current;
    int max;
public:
    TBook();
    ~TBook();
    void add(Telephone);
    void write();
    bool is_full();
    void print();
    void check();
    Telephone lookup(string);

};

#endif

Et voici à quoi ressemble TBook.cpp:

#include <iostream>
#include <fstream>
#include <string>

#include "TBook.h"
#include "Telephone.h"


using namespace std;

TBook::TBook(){
    current = 0;
    max = 9;

    cout << "Hello" << endl;

    string line;
    ifstream myfile ("rolodex.txt");
    if (myfile.is_open()){
        while ( getline (myfile,line) ){
            cout << line << endl;
            Telephone t;
            t.allNum(line);
            add(t);

        }
        myfile.close();
    }else if (!myfile.is_open()){
        ofstream myfile;
        myfile.open ("rolodex.txt");
        myfile << "This is an empty file (Relatively).";
        myfile.close();
    }
}

TBook::~TBook(){

}

void TBook::add(Telephone tel){
    if (!is_full()){
        rolodex[current] = tel;
        current++;
    }
}

void TBook::write(){
    ofstream myfile;
    myfile.open ("rolodex.txt");
    for (int i = 0; i < current; ++i)
    {
        myfile << rolodex[i].getName() << "," << rolodex[i].getAreaCode() << "," << rolodex[i].getNumber() << "\n";
    }
    myfile.close();
}

bool TBook::is_full(){
    if (current <= max){
        return false;
    }
    return true;
}

Telephone TBook::lookup(string lookName){
    for (int i = 0; i < current; ++i){
        if (rolodex[i].getName() == lookName){
            return rolodex[i];
        }
    }
    return Telephone(100, "", "1000000");
}

void TBook::print(){
    //Print the vairables
    for (int i = 0; i < current; ++i){
        cout << "Name: " << rolodex[i].getName() << endl;
    cout << "Number: (" <<  rolodex[i].getAreaCode() << ") " << rolodex[i].getNumber() << endl;
    }

}

void TBook::check(){
    cout << "the message" << endl;
}

Étant donné que le problème semble se poser avec la classe Téléphone, je pense que je devrais également montrer ce code aussi

Téléphone.h

..

#ifndef TELEPHONE_H
#define TELEPHONE_H

#include <iostream>
#include <string>


using std::string;

class Telephone{
private:
    string name;
    string num;
    int areaCode;
public:
    Telephone(int, string, string);
    Telephone();
    ~Telephone();
    bool setAreaCode(int);

    //Setters

    void setName(string);
    void setNumber(string);
    bool allNum(string);

    //Getters
    string getName();
    string getNumber();
    int getAreaCode();

    //Checks
    bool checkX(int);
    bool checkY(int);


};

#endif

Telephone.cpp

..

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>

#include "Telephone.h"

using namespace std;

Telephone::Telephone(){
    areaCode = 0
    name = "";
    num = "";
}

Telephone::Telephone(int aCode, string nam, string number){
   areaCode = aCode;
   name = name;

}

Telephone::~Telephone(){
    //Nope Nada
}

bool Telephone::allNum(string all){
    size_t found =  all.find_first_of(",");

    //
    string first = all.substr(0, found);
    string second = all.substr((found)+1, found+1);
    string third = all.substr( all.find_last_of(",")+1, all.length());
    int x, y;
    //convert string to int values
    if(third.length() == 7){
        x = atoi(third.substr(0,3).c_str()), 
        y = atoi(third.substr(3,4).c_str());
    }else{
        cerr << "Your phone number is not valid" << endl;
    }   
    int ac = atoi(second.substr(0, second.length()).c_str());

    setName(first);
    if (!setAreaCode(ac)){  
        setAreaCode(100);
        return true;

    }
    if (!checkX(x) || !checkY(y)){
            setNumber("1000000");
        }else{
            setNumber(third);
    }

    cerr << "The info provided is not valid" << endl;
    return false;
}

void Telephone::setNumber(string number){
    num = number;
}

bool Telephone::setAreaCode(int aCode){
    if(aCode >= 100 && aCode <= 999){
        areaCode = aCode;
        return true;
    }
    return false;
}

void  Telephone::setName(string theName){
    name = theName;
}

bool Telephone::checkX(int x){
    if(x >= 100 && x <= 999){
        return true;
    }
    cerr << "First three digits are not valid" << endl;
    return false;
}

bool Telephone::checkY(int y){
    if(y >= 0000 && y <= 9999){
        return true;
    }
    cerr << "Last four digits are not valid" << endl;
    return false;
}



//Getters
string Telephone::getName(){
    return name;
}

string Telephone::getNumber(){
    return num;
}

int Telephone::getAreaCode(){
    return areaCode;
}

Et mon fichier principal (également appelé test.cpp) ressemble à ceci:

test.cpp

#include <iostream>
#include <string>
#include "TBook.h"
#include "Telephone.h"

using namespace std;


int main(int argc, char const *argv[])
{
    //Create a Rolodex
    TBook addressBook;

    return 0;
}

Je reçois également cette erreur avec test.cpp

/tmp/ccl8anRb.o: In function `main':
test.cpp:(.text+0x24): undefined reference to `TBook::TBook()'
test.cpp:(.text+0x38): undefined reference to `TBook::~TBook()'
collect2: ld returned 1 exit status

Je pense que c'est surtout une erreur de compilation, mais je ne suis toujours pas sûr, et je sens que je suis la configuration du mème "Mon code ne fonctionne pas, et je ne sais pas pourquoi." Habituellement, je dénigrais le code et essayais différentes méthodes jusqu'à ce qu'il fonctionne, mais je n'ai tout simplement pas le temps. J'ai donc besoin de votre aide.

19
Kivo360

Il s'agit d'une erreur de l'éditeur de liens. Essayer:

g++ test.cpp Telephone.cpp -o test

Fondamentalement, l'éditeur de liens se plaint des fonctions que vous avez utilisées mais n'a pas fourni d'implémentation. Pour voir toutes les étapes que le compilateur effectue pour vous, ajoutez un - v:

g++ -v test.cpp Telephone.cpp -o test
32
Sven