cpp Multiple definition of....

cpp Multiple definition of....
Carlj28
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 7 lat
  • Postów:141
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:

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

w pliku .h:

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

w pliku .cc:

Kopiuj
#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ć ?


"I have no details because sometimes I feel lost, in my code."
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
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.

edytowany 1x, ostatnio: Azarien
ZJ
Kwestia gustu, .cpp jest popularniejsze, ale .cc nie jest błędem (podobnie jak .hpp). Jeszcze do wyboru jest .C, .cp, .cxx, .c++, .CPP (tzn. to rozpoznaje GCC jako C++).
Carlj28
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 7 lat
  • Postów:141
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:

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

w pliku .cpp:

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

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


"I have no details because sometimes I feel lost, in my code."
edytowany 1x, ostatnio: Carlj28
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
0

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

Kopiuj
#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.

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
0

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

Azarien
ostatnio się na tym przejechałem — kompilator LabWindows. widocznie nie jest „sensowny”…

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.