Classe de definição múltipla no arduino
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
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, inline
apesar de não exigir a inline
palavra - chave.
Ou se quiser manter Fooa
uma 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 of
erro 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 #include
usos alcançáveis transitivamente) no local onde a #include
diretiva apareceu. Ele não se comporta da mesma maneira que muitas diretivas de aparência semelhante em outras linguagens. Por exemplo, #include
não se comporta como a import
palavra - chave em Java ou python, por exemplo.