Уже определено в main.параметр obj [закрыт]
Это код для моей проблемы, и я получаю 4 ошибки:
- студент.obj: ошибка LNK2005: "struct Node * admitedFirstNode" (?admitedFirstNode@@3PAUNode@@A) уже определен в main.параметр obj
- студент.obj: ошибка LNK2005: "struct Node * allFirstNode" (?allFirstNode@@3PAUNode@@A) уже определен в main.параметр obj
- студент.obj: ошибка LNK2005: "struct Node * rejectedFirstNode" (?rejectedFirstNode@@3PAUNode@@A) уже определено в главный.параметр obj
- pb4_OOP_lab1Debugpb4_OOP_lab1.exe: фатальная ошибка LNK1169: найден один или несколько многозначных символов
#include "students.h" //main
int main()
{
for(int i=0;i<NR_STUDENTS;i++)
{
Student *s1=new Student;
cout<<"Enter name: ";
getline(cin,s1->name);
cout<<"Enter garde: ";
cin>>s1->grade;
cin.ignore();
addStudent(s1);
delete s1;
}
}
#include "students.h" //students.cpp
void AddNodeToList(Node *firstNode, Student *studToAdd)
{
Node *nodeToAdd=new Node;
nodeToAdd->student=studToAdd;
nodeToAdd->next=NULL;
if(firstNode==NULL)
{
firstNode=nodeToAdd;
}
else
{
Node *temp;
temp=firstNode;
while(temp->next != NULL)
{
temp=temp->next;
}
temp->next=nodeToAdd;
}
}
void addStudent(Student *studentToAdd)
{
AddNodeToList(allFirstNode,studentToAdd);
}
void split()
{
Node *temp=allFirstNode;
while(temp->next != NULL)
{
Student *currentStud=temp->student;
if(currentStud->grade < GR)
{
AddNodeToList(rejectedFirstNode,currentStud);
}
else
{
AddNodeToList(admitedFirstNode,currentStud);
}
}
}
void print(Node *firstNode)
{
if(firstNode==NULL)
{
return;
}
else
{
Node *temp=firstNode;
Student *current=temp->student;
while(temp->next != NULL)
{
cout<<"----------------------------------------------"<<endl;
cout<<"Student name: "<<current->name<<endl;
cout<<"Student grade: "<<current->grade<<endl;
}
}
}
#include <iostream> //students.h
#include <string>
using namespace std;
const int NR_STUDENTS=5;
const double GR=5.0;
struct Student
{
string name;
double grade;
};
struct Node
{
Student *student;
Node *next;
};
Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
void addStudent(Student *studentToAdd);
void split();
void sort();
void print();
3 ответов
определение Node * rejectedFirstNode;
в файле заголовка приводит к умножению определенного символа, потому что все единицы перевода, включающие этот заголовок, будут генерировать символ для него. Вместо этого, в заголовке, есть
//students.h
extern Node * rejectedFirstNode;
и переместите определение в один cpp файл:
//students.cpp
Node * rejectedFirstNode;
также кажется, что вы пишете C-код. Почему это помечено C++? Если вы не знаете обо всем, что может предложить C++, прочитайте хорошая вводная книга.
вы объявляете переменные в students.h и студенты.h входит в оба основных.cpp и студента.СРР.
вы должны избегать объявления переменных в файле заголовков.
Попробуйте поместить следующий код в студентов.cpp:
Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
вы admitedFirstNode
, allFirstNode
и rejectedFirstNode
определена в заголовочном файле. Это определяет его в каждом cpp, который включает в себя " студентов.H-файл".
разделить объявление и определение. Объявите их в разделе "студенты.h":
extern Node *allFirstNode;
extern Node *admitedFirstNode;
extern Node *rejectedFirstNode;
и в "студентах.cpp " определите переменные:
Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;