2012-08-04 16 views
5

Sono quasi sicuro al 100% ho il diritto di sintassi in entrambe le classi, ma sto ottenendo i seguenti errori:classi in più file in C++

Per CShape.cpp - "Errore C2011: ' CShape': 'classe' di tipo ridefinizione" per CCircle.cpp - "errore CS2504: 'CShape': classe di base non definita"

Ecco il codice completo per CShape.cpp

#include <iostream> 
using namespace std; 

class CShape 
{ 
protected: 
    float area; 
    virtual void calcArea(); 
public: 
    float getArea() 
    { 
     return area; 
    } 
} 

Ed è qui il codice per CCircle.cpp

Come si può vedere, CShape è la classe base di cui CCircle è stata ereditata. Sono abbastanza nuovo di C++, quindi potrei avere la struttura dei file sbagliata (forse la base dovrebbe essere in un file di intestazione?), Se qualcosa del genere è importante.

+1

L'intestazione per il file di intestazione è assente? Che ne dici di mettere '#pragma once' all'inizio di' CShape.h'? A proposito, 'using namespace ...;' è un cattivo odore per i file header. –

+3

Hai dimenticato il punto e virgola alla fine delle definizioni di classe. –

+0

@KerrekSB, sì, non è C# o Java! –

risposta

10

Mai #include file .cpp; ciò porterà al tipo di errori di ridefinizione che stai ottenendo. Invece, dichiara la classe in un file di intestazione e # include quello, e definisce i metodi di classe in un file .cpp.

// CShape.h 
class CShape 
{ 
protected: 
    float area; 
    virtual void calcArea(); 
public: 
    float getArea(); 
} 

file cpp:

// CShape.cpp 
#include "CShape.h" 
#include <iostream> 
using namespace std; 

float CShape::getArea() { 
    return area; 
} 

Si dovrebbe dividere CCircle simile - e CCircle.h dovrebbe # include CShape.h, e CCircle.cpp dovrebbe # include CCircle.h.

+0

Grazie mille!Per creare una classe Circle, Triangle, Rectangle, ecc che estenda la classe CShape, sarebbe meglio includere tutte quelle definizioni di classe nel file di intestazione CShape, quindi definire semplicemente i metodi di classe nei rispettivi file .cpp? Fondamentalmente avresti solo un file di intestazione e un file .cpp per ogni forma che dovevi creare. – NealR

+1

@NealR no, 'CShape' non dovrebbe sapere nulla sulle classi derivate. Le classi derivate dovrebbero includere l'intestazione 'CShape'. – juanchopanza

+1

Infatti; la migliore pratica è quella di avere un file .h e un file .cpp per ogni classe. –

4

Come avete indovinato, è necessario organizzare le classi in file separati per dichiarazione (file di intestazione) e definizione (file .cpp). È possibile lasciare le definizioni delle funzioni membro (con corpo) come (suggerito) in linea nei file di intestazione. Inserisci i blocchi di inclusione appropriati nei file di intestazione, per evitare più dichiarazioni di classe.

CShape.h:

#ifndef __CSHAPE_H__ 
#define __CSHAPE_H__ 
class CShape 
{ 
protected: 
    float area; 
    virtual void calcArea(); 
public: 
    float getArea() 
    { 
     return area; 
    } 
}; 
#endif 

CShape.cpp:

#include "CShape.h" 

void CShape::calcArea() 
{ 
    // Your implementation 
} 

CCircle.h:

#ifndef __CCIRCLE_H__ 
#define __CCIRCLE_H__ 
#include "CShape.h" 

class CCircle : public CShape 
{ 
protected: 
    int centerX; 
    int centerY; 
    float radius; 
    virtual void calcArea(); 
    { 
     area = M_PI * (radius * radius); 
    } 
public: 
    CCircle(int pCenterX, int pCenterY, float pRadius); 
    inline float getRadius() 
    { 
     return radius; 
    } 
}; 
#endif 

CCircle.cpp:

#include "CCircle.h" 

CCircle::CCircle(int pCenterX, int pCenterY, float pRadius) 
: centerX(pCenterX) 
, centerY(pCenterY) 
, radius(pRadius) 
{ 
} 
+0

thx, ragazzi rock! – NealR