Klasa z wieloma definicjami w Arduino
Pomóż mi tutaj. Nie wiem, czego mi brakuje. Mam ten kod w moim 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:
}
Mam pięć plików: Foo.h, Foo.cpp, Foo2.h, Foo3.cpp i 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()
{
}
I to daje mi błąd:
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
co robię źle
pozdrowienia,
Odpowiedzi
Jeśli chcesz Fooa()
być zdefiniowany w nagłówku, który może być zawarty w więcej niż jednym pliku .cpp, musisz zadeklarować go jako funkcję wbudowaną, na przykład:
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
inline bool Fooa();
bool Foob();
};
#endif
Alternatywnie możesz podać definicję funkcji bezpośrednio w definicji klasy; to również sprawia, że funkcja inline
nie wymaga inline
słowa kluczowego.
Lub jeśli chcesz zachować Fooa
jako funkcję nieliniową, musisz przenieść definicję z nagłówka do pliku .cpp, tak jak to zrobiłeś Foob()
.
Wprowadzenie funkcji w tekście ma drugi efekt, poza sugerowaniem, że chcesz, aby kod funkcji był generowany w miejscu wywołania; informuje kompilator (lub dokładniej konsolidator), że oczekuje wielu definicji (które muszą być identyczne) kodu funkcji. Bez tego zaawansowanego zauważenia pojawi się multiple definition of
błąd, gdy definicja funkcji zostanie wstawiona do wielu plików .cpp za pomocą pliku #include
.
Na marginesie: #include
to automatyczna forma kopiowania i wklejania. Logicznie rzecz biorąc, umieszcza zawartość innego pliku (i wszystkie jego osiągalne #include
zastosowania) w miejscu, w którym #include
pojawiła się dyrektywa. Nie zachowuje się tak samo, jak wiele podobnie wyglądających dyrektyw w innych językach. Np. #include
Nie zachowuje się jak import
słowo kluczowe na przykład w Javie lub Pythonie.