Klasa z wieloma definicjami w Arduino

Nov 27 2020

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

timemage Nov 27 2020 at 08:23

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 inlinenie wymaga inlinesłowa kluczowego.

Lub jeśli chcesz zachować Fooajako 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 ofbłąd, gdy definicja funkcji zostanie wstawiona do wielu plików .cpp za pomocą pliku #include.

Na marginesie: #includeto automatyczna forma kopiowania i wklejania. Logicznie rzecz biorąc, umieszcza zawartość innego pliku (i wszystkie jego osiągalne #includezastosowania) w miejscu, w którym #includepojawiła się dyrektywa. Nie zachowuje się tak samo, jak wiele podobnie wyglądających dyrektyw w innych językach. Np. #includeNie zachowuje się jak importsłowo kluczowe na przykład w Javie lub Pythonie.