2016-08-02 6 views
1

プログラムをビルドするときにこのエラーが発生します:Apple Mach-O Linker (ld) ErrorLinker Command failed with exit code 1。通常、このエラーを修正しようとすると、主な機能を持つファイルが#includeであるため、複数回ファイルが作成されています。しかし、私はこれが今回の場合だとは思わない。私はまた、Xコードによってduplicate symbol _passed in:ranker.oolympic.oと通知されます。私のコードに "Apple Mach-O Linker Error?"

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

誰かがこのエラーの原因を正確に何を見つけることで私を助けることができればそれをいただければ幸いです。ありがとう!

答えて

1

ヘッダーに変数を宣言すると、ヘッダーを含むすべてのファイルに複製されます。

ranker.hのint passed = 0;はあなたに多くの悲しみを与えます。 rankerとolympianはどちらも別のpassedを割り当てています。リンカーは現在、実際のものが渡されたというヒントを持っていません。

だから、あなたはおそらく何をしたいranker.hで

extern int passed; 

はそれがまだない場合には、ある時点で存在する渡さ宣言することですので、それが割り当てられている必要はありません。コンパイラはうれしく続けて、passedを使用できるようにします。

そしてranker.cppで、passedを割り当て、リンカを満たすために

int passed = 0; 

を宣言します。これで、passedが1つしかなく、ranker.hを含むすべての人がそれを見て使用することができます。

複数のpassedが必要な場合は、同じ名前と範囲を共有しないように別の操作を行う必要がありますが、これは目標のようには見えません。

トピックを外して:using namespace std;をヘッダーファイルに入れるように強くお勧めします。デバッグが非常に難しい将来の問題につながる可能性があります。その他の情報:Why is "using namespace std" considered bad practice?

関連する問題