9

これは私の問題のコードで、4 つのエラーが発生します。

  1. student.obj : エラー LNK2005: "struct Node * AdmissionedFirstNode" (?admitedFirstNode@@3PAUNode@@A) は main.obj で既に定義されています
  2. student.obj : エラー LNK2005: "struct Node * allFirstNode" (?allFirstNode@@3PAUNode@@A) は main.obj で既に定義されています
  3. student.obj : エラー LNK2005: "struct Node * rejectFirstNode" (?rejectedFirstNode@@3PAUNode@@A) は main.obj で既に定義されています
  4. pb4_OOP_lab1\Debug\pb4_OOP_lab1.exe: 致命的なエラー LNK1169: 1 つ以上の複数定義されたシンボルが見つかりました
#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();
4

3 に答える 3

18

ヘッダー ファイル内の定義Node * rejectedFirstNode;は、そのヘッダーを含むすべての翻訳単位がそのシンボルを生成するため、複数定義されたシンボルにつながります。代わりに、ヘッダーに

//students.h
extern Node * rejectedFirstNode;

定義を単一の cpp ファイルに移動します。

//students.cpp
Node * rejectedFirstNode;

Cコードを書いているようにも見えます。これが C++ とタグ付けされているのはなぜですか? C++ が提供するすべての機能を知らない場合は、優れた入門書を読んでください。

于 2012-10-29T20:02:21.210 に答える
3

あなたはstudents.hで変数を宣言しており、students.hはmain.cppとstudent.cppの両方に含まれています。

ヘッダー ファイルで変数を宣言することは避けてください。

次のコードを students.cpp に入れてみてください:

Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
于 2012-10-29T20:08:48.080 に答える
1

がありadmitedFirstNode、ヘッダー ファイルallFirstNoderejectedFirstNode定義されています。これにより、「students.h」ファイルを含むすべての cpp で定義されます。

宣言と定義を分割します。「students.h」でそれらを宣言します。

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

「students.cpp」で変数を定義します。

Node *allFirstNode;
Node *admitedFirstNode;
Node *rejectedFirstNode;
于 2012-10-29T20:04:09.397 に答える