Classe de definição múltipla no arduino

Nov 27 2020

Me ajude aqui. Eu não sei o que estou perdendo. Eu tenho este código em meu IDE arduino

#include "Foo2.h"
void setup() {
  // put your setup code here, to run once:

}
void loop() {
  // put your main code here, to run repeatedly:
}

E eu tenho cinco arquivos: Foo.h, Foo.cpp, Foo2.h, Foo3.cpp e 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()
{
}

E é me dar um erro:

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

o que estou fazendo de errado

Saudações,

Respostas

timemage Nov 27 2020 at 08:23

Se você deseja Fooa()ser definido em um cabeçalho que pode ser incluído em mais de um arquivo .cpp, você precisa declará-lo como uma função embutida da seguinte forma:

#ifndef Foo_H
#define Foo_H

class Foo
{
    public:
    Foo();

    public:
    inline bool Fooa();
    bool Foob();
};
#endif

Como alternativa, você pode fornecer a definição da função diretamente na definição da classe; isso também torna a função, inlineapesar de não exigir a inlinepalavra - chave.

Ou se quiser manter Fooauma função não embutida, você precisará mover a definição do cabeçalho para um arquivo .cpp como fez com Foob().

Tornar uma função embutida tem um segundo efeito além de implicar que você deseja que o código de uma função seja gerado no site da chamada; informa o compilador (ou mais precisamente o vinculador) para esperar ver várias definições (que devem ser idênticas) do código para a função. Sem que isso seja notado, você obterá o multiple definition oferro quando uma definição de função for inserida em vários arquivos .cpp por meio de um #include.

Como observação lateral: #includeé uma forma automatizada de copiar e colar. Ele logicamente instala o conteúdo de outro arquivo (e todos os seus #includeusos alcançáveis transitivamente) no local onde a #includediretiva apareceu. Ele não se comporta da mesma maneira que muitas diretivas de aparência semelhante em outras linguagens. Por exemplo, #includenão se comporta como a importpalavra - chave em Java ou python, por exemplo.