2016-08-02 22 views
1

Ich bekomme diesen Fehler, wenn ich das Programm erstelle: Apple Mach-O Linker (ld) ErrorLinker Command failed with exit code 1. Normalerweise, wenn ich versuche, diesen Fehler zu beheben, ist es, weil die Datei mit der Hauptfunktion #include -eine Datei mehr als einmal. Ich glaube jedoch nicht, dass dies diesmal der Fall ist. Ich werde auch von X-Code benachrichtigt, dass die duplicate symbol _passed in:ranker.o und olympic.o.Warum hat mein Code einen "Apple Mach-O Linker Fehler?"

//competitor.h 

#ifndef __Olympic_Lab__competitor__ 
#define __Olympic_Lab__competitor__ 

#include <iostream> 
using namespace std; 
class Competitor { 
    char* name = nullptr; 
    int laneAssignment;  
    float time; 
public: 
    Competitor(char n[], int lane); 
    ~Competitor(); 
    void setTime(float f); 
    char* getName(){ return name; } 
    int getLane(){  return laneAssignment; } 
    float getTime(){ return time; } 
    void print(){ cout << name << endl; } 
}; 
#endif 

//competitor.cpp 

#include "competitor.h" 
Competitor::Competitor(char n[], int lane){ 
    name = n; 
    laneAssignment = lane; 
} 
Competitor::~Competitor(){ 
    //does nothing for now 
} 
void Competitor::setTime(float t){ 
    time = t; 
} 

//ranker.h 

#ifndef __Olym__ranker__ 
#define __Olym__ranker__ 
#include <vector> 
#include "competitor.h" 
using namespace std; 
int passed = 0; 
class Ranker { 
    bool boolean = true; 
public: 
    vector<Competitor*> rv; 
    Ranker(int lanes); 
    ~Ranker(); 
    int addList(Competitor* c); 
    Competitor* getLane(int lane); 
    Competitor* getFinish(int finish); 
    int getFilled(); 
}; 
#endif 

//ranker.cpp 

#include "ranker.h" 
Ranker::Ranker(int lan){ 
    rv.resize(lan - 1); 
    for(int i = 0; i <= rv.size(); i++){ 
     rv[i] = nullptr; 
    } 
} 
Ranker::~Ranker(){ 
    for(int i = 0; i <= rv.size(); i++){ 
     delete rv[i]; 
    } 
} 
int Ranker::addList(Competitor *c){ 
    if(c != NULL && passed <= 4){ 
     rv[passed++] = c; 
     return passed - 1; 
    } 
    return 0; 
} 
Competitor* Ranker::getLane(int lane){ 
    for(int i = 0; i <= rv.size(); i++){ 
     if(rv[i]->getLane() == lane && rv[i] != NULL){ 
      return rv[i]; 
     } 
    } 
    return rv[0]; 
} 
Competitor* Ranker::getFinish(int finish){ 
    if(boolean){ 
     Competitor *temp = nullptr; 
     int highestIndex; 
     for(int i = rv.size(); i >= 0; i--){ 
      highestIndex = i; 
      for(int j = i; j >= 0; j--){ 
       if(rv[j] != nullptr && rv[highestIndex] != nullptr){ 
        if(rv[j]->getTime() > rv[highestIndex]->getTime()) 
         highestIndex = j; 
       } 
      } 
      temp = rv[i]; 
      rv[i] = rv[highestIndex]; 
      rv[highestIndex] = temp; 
     } 
     delete temp; 
     temp = *new Competitor*; 
     boolean = false; 
    } 
    return rv[finish - 1]; 
} 
int Ranker::getFilled(){ 
    int filled = 0; 
    for(int i = 0; i <= rv.size(); i++){ 
     if(rv[i] != NULL){ 
      filled++; 
     } 
    } 
    return filled; 
} 

//olympic.h 

#ifndef _Olympic_Lab__olympic__ 
#define _Olympic_Lab__olympic__ 
#include "ranker.h" 
#endif 

//olympic.cpp 

#include "olympic.h" 

int main(){ 
    const int lanes = 4; 
    Ranker rank(lanes); 
    Competitor* starters[4]; 
    starters[0] = new Competitor("EmmyLou Harris", 1); 
    starters[1] = new Competitor("Nanci Griffith", 2); 
    starters[2] = new Competitor("Bonnie Raitt", 3); 
    starters[3] = new Competitor("Joni Mitchell", 4); 
    starters[0]->setTime((float)12.0); 
    starters[1]->setTime((float)12.8); 
    starters[2]->setTime((float)11.0); 
    starters[3]->setTime((float)10.3); 
    for(int i = 0; i < lanes; i++){ 
     rank.addList(starters[i]); 
    } 
    cout << "Competitors by lane are:" << endl; 
    for(int i = 1; i <= lanes; i++) 
     rank.getLane(i)->print(); 
    cout << "Rankings by finish are:" << endl; 
    for(int i = 1; i <= lanes; i++) 
     rank.getFinish(i)->print(); 
    for(int i = 0; i < lanes; i++){ 
     delete starters[i]; 
    } 
} 

Es wäre dankbar, wenn mir jemand helfen könnte bei der Suche nach genau was diesen Fehler verursacht. Vielen Dank!

Antwort

1

Wenn Sie eine Variable in einem Header deklarieren, wird sie in jeder Datei dupliziert, die den Header enthält.

So int passed = 0; in ranker.h wird Ihnen viel Kummer geben. ranker und olympisch haben beide einen anderen passed zugeteilt und der Linker hat jetzt keine Ahnung, welches das eigentliche ist.

Also, was Sie wollen wahrscheinlich ist

extern int passed; 

in ranker.h, dass an einem gewissen Punkt überschritten zu erklären existieren wird, wenn es noch nicht der Fall ist, so muss es nicht zugeordnet werden. Der Compiler wird glücklich weitermachen und Ihnen erlauben, passed zu verwenden.

Und dann in ranker.cpp erklären

int passed = 0; 

passed zuzuweisen und den Linker erfüllen. Jetzt haben Sie nur noch einen passed und jeder, der ranker.h enthält, kann es sehen und benutzen.

Wenn Sie mehr als eine passed möchten, müssen Sie etwas anderes tun, damit sie nicht den gleichen Namen und den gleichen Bereich teilen, aber das sieht nicht wie Ihr Ziel aus.

Off Thema: widerstehen Sie dem Drängen, using namespace std; in eine Header-Datei zu setzen. Es kann zu zukünftigen Problemen führen, die sehr schwer zu debuggen sind. Mehr hier: Why is "using namespace std" considered bad practice?