gpt4 book ai didi

c++ - 为什么我的代码有一个 "Apple Mach-O Linker Error?"

转载 作者:行者123 更新时间:2023-11-30 05:24:20 25 4
gpt4 key购买 nike

我在构建程序时遇到此错误:Apple Mach-O Linker (ld) Error Linker Command failed with exit code 1。通常当我尝试修复此错误时,是因为具有 main 函数的文件不止一次被#include-ing 文件。但是,我不认为这次是这样。 X Code 还通知我 duplicate symbol _passed in: ranker.oolympic.o

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

如果有人可以帮助我找到导致此错误的确切原因,我们将不胜感激。谢谢!

最佳答案

如果您在 header 中声明一个变量,它将在包含该 header 的每个文件中复制。

所以 ranker.h 中的 int passed = 0; 会给你带来很多麻烦。 ranker 和 olympian 都分配了不同的 passed,链接器现在不知道哪个是真正的 passed。

所以你可能想要的是

extern int passed;

在 ranker.h 中声明 passed 会在某个时候存在,如果还不存在,则不需要分配。编译器将愉快地继续并允许您使用 passed

然后在ranker.cpp中声明

int passed = 0;

分配通过并满足链接器。现在你只有一个 passed 并且任何包含 ranker.h 的人都可以看到并使用它。

如果您希望不止一个通过,您必须做一些其他的事情,这样它们就不会共享相同的名称和范围,但这看起来不像您的目标。

题外话:抵制将 using namespace std; 放在头文件中的冲动。它可能导致将来很难调试的问题。更多信息:Why is "using namespace std" considered bad practice?

关于c++ - 为什么我的代码有一个 "Apple Mach-O Linker Error?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38711521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com