2012-08-04 14 views
5

estoy casi 100% seguro de que tengo el derecho de sintaxis en ambas clases, sin embargo, me estoy poniendo los siguientes errores:clases en varios archivos en C++

Para CShape.cpp - "error C2011: ' CShape': 'clase' tipo redefinición" para CCircle.cpp - "CS2504 de error: 'CShape': clase base indefinido"

aquí está el código completo para CShape.cpp

#include <iostream> 
using namespace std; 

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

Y aquí está el código para CCircle.cpp

#include <iostream> 
#include "CShape.cpp" 
#define _USE_MATH_DEFINES 
#include "math.h" 
using namespace std; 

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

Como se puede ver, CShape es la clase base que se CCircle suppsoed heredar de. Soy bastante nuevo en C++, por lo que podría tener las estructuras de archivos incorrectas (¿se supone que la base debe estar en un archivo de encabezado?), Si algo así es importante.

+1

encabezado para el archivo de cabecera está ausente? ¿Qué tal si coloca '#pragma una vez' al comienzo de' CShape.h'? Por cierto, 'using namespace ...;' es un mal olor para los archivos de encabezado. –

+3

Olvidó los puntos y comas al final de las definiciones de clase. –

+0

@KerrekSB, sí, ¡no es C# ni Java! –

Respuesta

10

archivos .cpp Nunca # include; eso conducirá al tipo de errores de redefinición que está recibiendo. En cambio, declaran la clase en un fichero de cabecera y # include que uno, y definen los métodos de la clase en un archivo .cpp.

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

archivo .cpp:

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

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

Usted debe dividir CCircle de manera similar - y CCircle.h debe # include CShape.h y CCircle.cpp debe # include CCircle.h.

+0

¡Muchas gracias!Para hacer una clase Circle, Triangle, Rectangle, etc. que extienda la clase CShape, ¿sería mejor incluir todas esas definiciones de clase en el archivo de cabecera CShape y luego simplemente definir los métodos de clase en sus respectivos archivos .cpp? Básicamente, solo tendría un archivo de cabecera y un archivo .cpp para cada forma que necesitara crear. – NealR

+1

@NealR no, 'CShape' no debería saber nada acerca de las clases derivadas. Las clases derivadas deben incluir el encabezado 'CShape'. – juanchopanza

+1

De hecho; la mejor práctica es tener un .h y un archivo .cpp para cada clase. –

4

Como has adivinado, usted debe organizar sus clases en archivos separados para la declaración (archivo de cabecera) y la definición (archivo .cpp). Puede dejar definiciones de funciones miembro (con cuerpo) como (sugeridas) en línea en los archivos de encabezado. Ponga bloqueadores de inclusión apropiados en los archivos de encabezado, para evitar declaraciones de clases múltiples.

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: guardia

#include "CCircle.h" 

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

¡zas, chicos! – NealR

Cuestiones relacionadas