2013-02-23 10 views
8

Non ho davvero capito come risolvere questo errore di ridefinizione.Ridefinizione dell'errore di struttura, l'ho definito solo una volta

COMPILE + ERRORI

g++ main.cpp list.cpp line.cpp 
In file included from list.cpp:5:0: 
line.h:2:8: error: redefinition of âstruct Lineâ 
line.h:2:8: error: previous definition of âstruct Lineâ 

main.cpp

#include <iostream> 
using namespace std; 
#include "list.h" 

int main() { 
    int no; 
    // List list; 

    cout << "List Processor\n==============" << endl; 
    cout << "Enter number of items : "; 
    cin >> no; 

    // list.set(no); 
    // list.display(); 
} 

list.h

#include "line.h" 
#define MAX_LINES 10 
using namespace std; 

struct List{ 
    private: 
     struct Line line[MAX_LINES]; 
    public: 
     void set(int no); 
     void display() const; 
}; 

line.h

#define MAX_CHARS 10 
struct Line { 
    private: 
     int num; 
     char numOfItem[MAX_CHARS + 1]; // the one is null byte 
    public: 
     bool set(int n, const char* str); 
     void display() const; 
}; 

list.cpp

#include <iostream> 
#include <cstring> 
using namespace std; 
#include "list.h" 
#include "line.h" 

void List::set(int no) {} 

void List::display() const {} 

line.cpp

#include <iostream> 
#include <cstring> 
using namespace std; 
#include "line.h" 

bool Line::set(int n, const char* str) {} 

void Line::display() const {} 
+0

Possibile dupplicate: http://stackoverflow.com/questions/14792903/accessing-classes-from-another-source-in-c-issues-initializing- the-constructo/14792927 # 14792927 –

+0

Aggiungi protezioni intestazione. –

risposta

10

In list.cpp, si includono sia "line.h" sia "list.h". Ma "list.h" include già "line.h" quindi "list.h" è in realtà incluso due volte nel tuo codice. (il preprocessore non è abbastanza intelligente da non includere qualcosa che già possiede).

ci sono due soluzioni:

  • Non includere "list.h" direttamente nel file list.cpp, ma è una pratica che non è scalabile: si deve ricordare ciò che ogni intestazione della vostra il file include e quello sarà troppo molto rapidamente.
  • uso includono guardie, come spiegato da @juanchopanza
+0

Questo è quello che era! Rimosso 'line.h' da list.cpp come includendo' list.h' contiene già 'line.h'. Grazie. – eveo

20

Hai bisogno di mettere include guards nelle intestazioni.

+0

+1. E non si dovrebbe mai dimenticare di farlo ogni volta) – SChepurin

+0

Questo è un corso introduttivo al CPP. Nessun altro usa il codice come questo, non posso neanche perché non lo abbiamo trattato in classe. Scusa, ci deve essere un'altra soluzione più semplice per la ridefinizione. – eveo

+0

In realtà, tutto ciò che dovevo fare era rimuovere '#include line.h' nel mio' list.cpp'. Grazie comunque! – eveo

1

Si include "line.h" due volte e non si dispone di protezioni incluse nei file di intestazione.

Se si aggiunge qualcosa di simile:

#ifndef LINE_H 
#define LINE_H 
... rest of header file goes here ... 
#endif 

ai file di intestazione, sarà tutto funzionerà bene.