cpp Multiple definition of....

0

Witam,
Mam problem przy podziale mojego kodu na pliki. Posiadam jedną klasę abstrakcyjną A i 3 podklasy dziedziczące z A, w niej też zawarte są funkcje virtual. Podzieliłem każdą podklasę na pliki .h i .cc i jeżeli w więcej niż jednej w pliku .cc będą zawarte ciała moich funkcji virtual z A to powstaje błąd Multiple definition of(nazwa funkcji virtual). Wygląda to tak:

class A{
public:
virtual void f()=0;
}

w pliku .h:

#include"A.h"
class B : public A{
public:
void f();
}

w pliku .cc:

#include"B.h"

void B::f() {/*ciało funkcji*/}

Jeżeli mam tylko jedną podklasę tak podzieloną na pliki .h i .cc to nie ma problemu z kompilacją, ale jeżeli podzielę kolejną podklasę z samego pliku .h na .h i .cc i w .cc znajdą się ta sama funkcja virtual co w B to już kompilator sygnalizuje błąd. Co powinienem zmienić ?

0

Używa się raczej rozszerzenia .cpp a nie .cc no ale to bez znaczenia.

jeżeli w więcej niż jednej w pliku .cc będą zawarte ciała moich funkcji virtual z A
A dlaczego miałyby być zawarte w więcej niż jednym pliku?

ale jeżeli podzielę kolejną podklasę z samego pliku .h na .h i .cc i w .cc znajdą się ta sama funkcja virtual co w B
pokaż przykład.

0

Powiedzmy że mam zrobione tak jak wyżej, i do tego dwa pliki z innymi podklasami (tylko .h) w których zawarte są ciała funkcji virtual to wszystko działa, ale jak podzielę kolejną podklasę powiedzmy C na .h i .cpp
w pliku .h:

#include"A.h"
class C : public A{
public:
void f();
}

w pliku .cpp:

#include"C.h"
 
void C::f() {/*ciało funkcji*/}

Czyli tak samo jak klasę B to pojawia się błąd.

0

Nie powinno. Daj dla pewności strażników w plikach .h, czyli tak:

#ifndef _A_H_
#define _A_H_

// tutaj cała zawartość pliku a.h

#endif _A_H_

dokładna nazwa makra _A_H_ nie jest istotna, ważne żeby była inna w każdym pliku .h, najlepiej jakoś związana z nazwą tego pliku.

0

Ew. #pragma once na początku pliku. Niestandardowe, ale każdy sensowny kompilator wspiera (clang/vc++/gcc/intel).

1 użytkowników online, w tym zalogowanych: 0, gości: 1