Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Already defined in main.obj [closed]

Tags:

c++

visual-c++

This is the code for my problem and i get 4 errors:

  1. student.obj : error LNK2005: "struct Node * admitedFirstNode" (?admitedFirstNode@@3PAUNode@@A) already defined in main.obj
  2. student.obj : error LNK2005: "struct Node * allFirstNode" (?allFirstNode@@3PAUNode@@A) already defined in main.obj
  3. student.obj : error LNK2005: "struct Node * rejectedFirstNode" (?rejectedFirstNode@@3PAUNode@@A) already defined in main.obj
  4. pb4_OOP_lab1\Debug\pb4_OOP_lab1.exe : fatal error LNK1169: one or more multiply defined symbols found
#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();
like image 541
laura Avatar asked Oct 29 '12 19:10

laura


3 Answers

The definition Node * rejectedFirstNode; in a header file leads to a multiply defined symbol because all translation units that include that header will generate a symbol for it. Instead, in the header, have

//students.h
extern Node * rejectedFirstNode;

and move the definition in a single cpp file:

//students.cpp
Node * rejectedFirstNode;

It also seems like you're writing C code. Why is this tagged C++? If you're unaware of all C++ has to offer, read a good introductory book.

like image 90
Luchian Grigore Avatar answered Oct 14 '22 03:10

Luchian Grigore


You are declaring variables in students.h and students.h is included in both main.cpp and student.cpp.

You should avoid declaring variables in headers file.

Try to put following code into students.cpp :

Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
like image 24
gogoprog Avatar answered Oct 14 '22 02:10

gogoprog


You have admitedFirstNode, allFirstNode and rejectedFirstNode defined in the header file. This defines it in every cpp, that includes the "students.h" file.

Split the declaration and definition. Declare them in "students.h":

extern Node *allFirstNode;
extern Node *admitedFirstNode;
extern Node *rejectedFirstNode;

and in "students.cpp" define the variables:

Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
like image 41
Olaf Dietsche Avatar answered Oct 14 '22 01:10

Olaf Dietsche