cpp Multiple definition of....

2012-05-08 18:23
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ć ?


"I have no details because sometimes I feel lost, in my code."

Pozostało 580 znaków

2012-05-08 18:33
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, 2012-05-08 18:34
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++). - Zjarek 2012-05-08 21:02

Pozostało 580 znaków

2012-05-08 18:39
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.


"I have no details because sometimes I feel lost, in my code."
edytowany 1x, ostatnio: Carlj28, 2012-05-08 18:39

Pozostało 580 znaków

2012-05-08 20:11
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.

Pozostało 580 znaków

2012-05-08 20:50
Rev
0

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


ostatnio się na tym przejechałem — kompilator LabWindows. widocznie nie jest „sensowny”… - Azarien 2012-05-08 21:45

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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