Clase de definición múltiple en arduino
Ayudame aqui. No sé lo que me estoy perdiendo. Tengo este código en mi arduino IDE
#include "Foo2.h"
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
Y tengo cinco archivos: Foo.h, Foo.cpp, Foo2.h, Foo3.cpp y Foo.h
Foo.h
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
bool Fooa();
bool Foob();
};
#endif
Foo.cpp
#include "Foo.h"
Foo::Foo()
{
}
bool Foo::Foob()
{
return true;
}
Foo2.h
#ifndef Foo2_H
#define Foo2_H
#define LIBRARY_VERSION 1.0.0
#include "Foo.h"
bool Foo::Fooa()
{
return true;
}
#endif
Foo3.h
#ifndef Foo3_H
#define Foo3_H
#include "Foo2.h"
class Foo3
{
public:
Foo3();
Foo _foo;
};
#endif
Foo3.cpp
#include "Foo3.h"
Foo3::Foo3()
{
}
Y me da un error:
libraries\Foo\Foo3.cpp.o (symbol from plugin): In function `Foo::Fooa()':
(.text+0x0): multiple definition of `Foo::Fooa()'
sketch\kk2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
que estoy haciendo mal
Saludos,
Respuestas
Si desea Fooa()
estar definido en un encabezado que se puede incluir en más de un archivo .cpp, deberá declararlo como una función en línea así:
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
inline bool Fooa();
bool Foob();
};
#endif
Alternativamente, puede proporcionar la definición de función directamente dentro de la definición de clase; esto también hace que la función a inline
pesar de no requerir la inline
palabra clave.
O si desea mantenerlo Fooa
como una función no en línea, necesitará mover la definición del encabezado a un archivo .cpp como lo hizo con Foob()
.
Hacer una función en línea tiene un segundo efecto más allá de implicar que desea que se genere el código de una función en el sitio de la llamada; informa al compilador (o más exactamente al enlazador) que espera ver múltiples definiciones (que deben ser idénticas) del código para la función. Si no se nota ese avanzado, obtendrá el multiple definition of
error cuando se inserte una definición de función en varios archivos .cpp a través de un archivo #include
.
Como nota al margen: #include
es una forma automatizada de copiar y pegar. Lógicamente, coloca el contenido de otro archivo (y todos sus #include
usos accesibles de forma transitiva) en el lugar donde #include
apareció la directiva. No se comporta de la misma manera que lo hacen muchas directivas de aspecto similar en otros lenguajes. Por ejemplo, #include
no se comporta como lo hace la import
palabra clave en, por ejemplo, Java o Python.