cpp and c++ class header redefinition

c++ - and - Error de redefinición múltiple



class h and class cpp (5)

  1. Reconstruir todo
  2. Busque Piece :: Piece y elimine todos los archivos de encabezado 2b. Nunca #include archivos .cpp
  3. Busque #define que se resuelve en Pieza

Después de aprender más sobre clases y punteros, rediseñé un programa que tenía y eliminé 200 líneas de código, en el proceso creando otras dos clases, Location y Piece . El problema es que, después de obtener todo para compilar, el enlazador se queja de que el constructor de Piece se define varias veces, con una carga de errores:

In function ''Piece'': board.o multiple definition of ''Piece::Piece(int)` char_traits.h In function ''Piece'': board.o multiple definition of ''Piece::Piece(int)` piece.cpp In function ''Piece'': player.o multiple definition of ''Piece::Piece(int)` piece.cpp In function ''Piece'': player.o multiple definition of ''Piece::Piece(int)` piece.cpp (yes, same exact error!) In function ''Piece'': refereee.o multiple definition of ''Piece::Piece(int)` char_traits.h In function ''Piece'': referee.o multiple definition of ''Piece::Piece(int)` piece.cpp ...

Cuando hago clic en el error de char_traits.h , me lleva a esto:

static size_t length(const char_type* __s) //error points here to line 262 { return __builtin_strlen(__s); }

Otro char_traits.h me lleva a

static int compare(const char_type* __s1, const char_type* __s2, size_t __n) //line 258, error points here too { return __builtin_memcmp(__s1, __s2, __n); }

Y para que lo sepas, location.h es lo único que incluye piece.h (bueno, otros archivos incluyen piece.h indirectamente de location including piece.h), board.h es lo único que incluye location.h, y un montón de clases incluyen board.h

Traté de cambiar el protector de encabezado a _OTHELLO_PIECE_H , e intenté cambiar el nombre de la clase a OPiece (a través del IDE). Ninguno de los dos solucionó el problema.

Lo curioso es que uno de los errores tiene una ''función'' OPiece '': ", y luego mi IDE pone chatter.o , aunque ni chatter.h ni chatter.cpp incluyen nada que incluya OPiece.

¿Alguna idea de lo que podría estar causando este error de redefinición?


Deberías poner la implementación del constructor en piece.cpp , no directamente en piece.h .


La causa más común de un error de definición de función múltiple es poner una definición de función en un archivo de encabezado y olvidarse de hacerlo en inline .

No me preocuparía demasiado por char_traits.h , esto probablemente significa que debido a un patrón de plantilla, el enlazador no pudo encontrar un mejor lugar para reclamar la definición que ocurrió en ese archivo de objeto en particular.


Solo una suposición: ¿ #include o #import por accidente? Lo que me pasó una vez :-)


hay dos lugares para implementar Piece::Piece(int) en una compilación típica:

1) la interfaz (en la declaración)

class Piece { int d_a; public: Piece(int a) : d_a(a) { } /* ... */ };

2) en un archivo cpp dedicado

en Piece.hpp

class Piece { int d_a; public: Piece(int a); /* ... */ };

en Piece.cpp

Piece::Piece(int a) : d_a(a) { }

sin embargo, las plantillas se definen de manera diferente.

el error a menudo indica que Piece::Piece(int a) : d_a(a) {} se incluye en varios archivos cpp.

cada archivo de objeto producido agrega el símbolo Piece::Piece(int) donde es visible.

al final de la creación, todos los objetos se fusionan / vinculan para crear su binario o ejecutable final. entonces el enlazador ve que hay copias de esta definición y produce un error.

Una manera rápida de diagnosticar esto es (suponiendo que sus compilaciones no demoren):

#warning Piece::Piece(int) is visible here Piece::Piece(int a) : d_a(a) { }

exactamente una advertencia debe ser emitida. si se emiten más, entonces el compilador probablemente proporcionará un poco de información (como el orden de inclusión).