Clase de definición múltiple en arduino

Nov 27 2020

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

timemage Nov 27 2020 at 08:23

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 inlinepesar de no requerir la inlinepalabra clave.

O si desea mantenerlo Fooacomo 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 oferror cuando se inserte una definición de función en varios archivos .cpp a través de un archivo #include.

Como nota al margen: #includees una forma automatizada de copiar y pegar. Lógicamente, coloca el contenido de otro archivo (y todos sus #includeusos accesibles de forma transitiva) en el lugar donde #includeapareció la directiva. No se comporta de la misma manera que lo hacen muchas directivas de aspecto similar en otros lenguajes. Por ejemplo, #includeno se comporta como lo hace la importpalabra clave en, por ejemplo, Java o Python.