[VC2008] Serializacja klas

0

Witam,
Zaimplementowałem serializację klas w moim programie do tworzenia grafiki, tak aby można było zapisywać wszystkie tworzone rysunki w postaci pliku. Podczas kompilacji pojawia się coś takiego:

1>------ Build started: Project: Gimp, Configuration: Debug Win32 ------
1>Linking...
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CElement::GetRuntimeClass(void)const " (?GetRuntimeClass@CElement@@UBEPAUCRuntimeClass@@XZ)
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CLine::GetRuntimeClass(void)const " (?GetRuntimeClass@CLine@@UBEPAUCRuntimeClass@@XZ)
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CRectangle::GetRuntimeClass(void)const " (?GetRuntimeClass@CRectangle@@UBEPAUCRuntimeClass@@XZ)
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CCircle::GetRuntimeClass(void)const " (?GetRuntimeClass@CCircle@@UBEPAUCRuntimeClass@@XZ)
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CCurve::GetRuntimeClass(void)const " (?GetRuntimeClass@CCurve@@UBEPAUCRuntimeClass@@XZ)
1>Element.obj : error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CText::GetRuntimeClass(void)const " (?GetRuntimeClass@CText@@UBEPAUCRuntimeClass@@XZ)
1>C:\Documents and Settings\krzysiek\Moje dokumenty\Visual Studio 2008\002\Gimp\Debug\Gimp.exe : fatal error LNK1120: 6 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\krzysiek\Moje dokumenty\Visual Studio 2008\002\Gimp\Gimp\Debug\BuildLog.htm"
1>Gimp - 7 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Czy ktoś wie gdzie leży wina?

Z góry dzięki za pomoc

0

na oko, zapomniales zaimplementowac tych funkcji..
klasy CLine/CCircle/CCurve/CText sa stworzone przez Ciebie? wszystkie one maja zaimplementowane lub dziedzicza GetRuntimeClass ?

0

Witam,
Klasy CLine/CCircle/CCurve/CText są stworzone przeze mnie.
Najprawdopodobniej GetRuntimeClass dziedziczone jest z klasy CObject. Klasa CObject to klasa bazowa klasy CElement. Klasa CElement to klasa bazowa klas CLine/CCircle/CCurve/CText.

0

Jeśli bys czytał i analizowal czyjś kompletnie Ci nieznany kod, no, to jeszcze by przeszło, ale w Twoim kodzie nie ma czegos takiego jak 'najprawdopodobniej'. Albo wiesz, albo nie. Jeśli nie wiesz to sprawdź, ale nie chrzan o prawdopodobienstwie, bo to oznacza ze po prostu piszesz ale wlasciwie nie wiesz co sie dzieje :/

Kompilator wyraźnie Ci mówi: brak implementacji używanych metod 'GetRuntimeClass', wiec pierwsza rzecz jaka powinienes byl zrobic, to przekopac caly kod i dowiedziec sie 'co to kufa za metoda', gdyz albo Ty masz skleroze, albo Ty masz skleroze:), albo Ty probujesz uzyc czegos ale o czyms nie wiesz...

Blad ten tradycyjnie wystepuje on w momencie gdy w pliku .h wpiszesz sobie sygnaturke metody, w pliku .cpp jej NIE zaimplementujesz np. zostawiajac sobie ja na pozniej, a na podstawie pliku .h reszta kodu zacznie używać tej metody - sadzac ze istnieje dzieki fwd decl w .h - oczywiscie wszystko sie skompiluje, ale potem bedzie taki wlasnie blad przy linkowaniu.

Druga popularna opcja jest taka, ze odziedziczyles cos z klasy bazowej, ktora pochodzi z jakiejs biblioteki (gimp?), stamtad tez przyszly .h/.hpp opisujace jej klasy, ale nie przyszly .cpp gdyz wszystko upakowano do .exe/.dll/.so/.lib. W tym przypadku to moze oznaczac ze zapomniales do opcji linkowania dołączyć właśnie jakiegoś .lib w ktorym implementacje tych metod są zawarte.

Ostatnia opcja - defacto kopia opcji pierwszej, ale trudniejsza do zauwazenia: masz literowke w sygnaturze metody lub jej implementacji.. np. pomyliles sie w nazwie metody, tu wywaliles/dorzuciles const a tam nie. Dobry kompilator powinien Ci natychmiast zwrocic uwage w stylu 'member not declared in class declaration', ale np. juz jak podczas implementowania metody klasy zapomnisz przy jej nazwie dodac Klasa::, to kompilator juz nie ma szans tego wykryc i znowu skonczysz z bledem takim jak omawiany..

Wiecej opcji raczej nie ma, bo nie przeszedlbys przez faze kompilacji

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