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.
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