2013-10-29 14 views
18

Ich bin endlich ziemlich verzweifelt. Also wurden wir in meiner C++ - Klasse angewiesen, Klassen zu verwenden. Wir würden die Header-Datei deklarieren die Klasse und Funktionen, während eine separate .cpp-Datei implementiert es. Die Dinge sollten funktionieren, aber sie sind nicht und keine Lösungen im Web scheinen für mich zu arbeiten. Ich benutze den G ++ - Compiler für Linux, und es scheint nicht auf IDEs oder der normalen Befehlszeile zu funktionieren.G ++ undefined Verweis auf Klasse :: Funktion

Der Fehler ich in meinem TBook.h bekommen, ist dies:

/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] 

Ich bin gefallen Art nicht, dass die Datei nicht Methoden jede der Telefonklasse empfängt. Hier ist, was der Code wie für TBook.h aussieht:

#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 

Und das ist, was TBook.cpp wie folgt aussieht:

#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; 
} 

Da das Problem mit der Telefon Klasse zu entstehen scheint, Ich denke, ich auch

Telephone.h

.. sollte auch dieser Code zeigen

#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; 
} 

Und meine Haupt-Datei (auch genannt test.cpp) sieht wie folgt aus:

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; 
} 

Ich erhalte diesen Fehler auch mit 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 

Ich denke, dies ist vor allem ein Übersetzungsfehler, aber ich bin noch nicht sicher, und ich fühle mich wie ich das bin Setup des Mems "Mein Code funktioniert nicht, und ich weiß nicht warum." Normalerweise würde ich den Code bash und verschiedene Methoden ausprobieren, bis es funktioniert, aber ich habe einfach nicht die Zeit. Ich brauche daher deine Hilfe.

+0

Auch ich verwendet, um die Wachen in den Header-Dateien. Sie funktionieren nicht wirklich für mich. – Kivo360

+7

Ich interessiere mich mehr für: 1) wo Ihre Dateien sind (insgesamt in der gleichen Richtung?) Und 2) die Befehlszeile, die Sie verwenden, um Ihren Code zu kompilieren. Verwenden Sie '-c', dann verknüpfen? Gibt man sonst 'g ++' alle Dateien, die die ganze Klasse enthalten? Naiv und einfach: 'g ++ * .cpp' ... – ShinTakezou

+0

Was ShinTakezou sagt; Der Fehler scheint, als ob Sie nicht alle Objektdateien verknüpfen, wenn Sie die ausführbare Datei verknüpfen. – Angew

Antwort

31

Dies ist ein Linker-Fehler. Versuchen Sie:

Im Grunde beschwert sich der Linker über Funktionen, die Sie verwendet haben, aber keine Implementierung für. Um zu sehen, alle Schritte der Compiler für Sie durchführt, werfen in einem -v:

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