steckel Temat założony przez niniejszego użytkownika |
[Allegro] Visual C++, multiple definition, linker error » 2009-07-21 22:18:07 Mam problem z konstruktorem. Kompilator "mówi", że mam multidefinicję: #include <string> #include <allegro.h> using namespace std; class cObject { public: string m_strName; int m_iPositionX; int m_iPositionY; BITMAP * m_bmImage; int m_iWidth; int m_iHeight; cObject(); cObject( string, int, int, string ); };
class cCharacter : public cObject { public: int m_iHP; int m_iAttack; int m_iDefense; int m_iInjuryMin; int m_iInjuryMax; int m_iSpeed; };
class cMonster : public cCharacter { };
class cPlayer : public cCharacter { };
cObject::cObject() { string m_strName = "Object"; int m_iPositionX = 0; int m_iPositionY = 0; BITMAP * m_bmImage = create_bitmap( 50, 50 ); int m_iWidth = 50; int m_iHeight = 50; }
cObject::cObject( string strName, int iPositionX, int iPositionY, string strPathOfFile ) { string m_strName = strName; int m_iPositionX = iPositionX; int m_iPositionY = iPositionY; BITMAP * m_bmImage = load_bmp( strPathOfFile.c_str(), default_palette ); int m_iWidth = m_bmImage->w; int m_iHeight = m_bmImage->h; }
Logi: D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject() ':| D:\p rojekty\inne\diablo\class.cpp | 34 | warning : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 35 | warning : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 36 | warning : unused variable 'm_bmImage' | D:\p rojekty\inne\diablo\class.cpp | 37 | warning : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 38 | warning : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject( std::string, int, int, std::string ) ':| D:\p rojekty\inne\diablo\class.cpp | 43 | warning : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 44 | warning : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 46 | warning : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 47 | warning : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\main.cpp || In function ` int _mangled_main() ':| D:\p rojekty\inne\diablo\main.cpp | 8 | warning : control reaches end of non - void function | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject() ':| D:\p rojekty\inne\diablo\class.cpp | 34 | warning : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 35 | warning : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 36 | warning : unused variable 'm_bmImage' | D:\p rojekty\inne\diablo\class.cpp | 37 | warning : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 38 | warning : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\class.cpp || In constructor ` cObject::cObject( std::string, int, int, std::string ) ':| D:\p rojekty\inne\diablo\class.cpp | 43 | warning : unused variable 'm_iPositionX' | D:\p rojekty\inne\diablo\class.cpp | 44 | warning : unused variable 'm_iPositionY' | D:\p rojekty\inne\diablo\class.cpp | 46 | warning : unused variable 'm_iWidth' | D:\p rojekty\inne\diablo\class.cpp | 47 | warning : unused variable 'm_iHeight' | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x0 ) || In function ` ZN7cObjectC2Ev ':| D:\p rojekty\inne\diablo\class.cpp | 32 | multiple definition of ` cObject::cObject() '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0xa2 ) : D:\p rojekty\inne\diablo\class.cpp | 32 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x346 ) || In function ` ZN7cObjectC1Ev ':| D:\p rojekty\inne\diablo\class.cpp | 32 | multiple definition of ` cObject::cObject() '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0x3e8 ) : D:\p rojekty\inne\diablo\class.cpp | 32 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x68c ) || In function ` ZN7cObjectC2ESsiiSs ':| D:\p rojekty\inne\diablo\class.cpp | 41 | multiple definition of ` cObject::cObject( std::string, int, int, std::string ) '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0x72e ) : D:\p rojekty\inne\diablo\class.cpp | 41 | first defined here | D:\p rojekty\inne\diablo\.objs\class.o(.text + 0x9aa ) || In function ` ZN7cObjectC1ESsiiSs ':| D:\p rojekty\inne\diablo\class.cpp | 41 | multiple definition of ` cObject::cObject( std::string, int, int, std::string ) '| D:\p rojekty\inne\diablo\.objs\main.o(.text + 0xa4c ) : D:\p rojekty\inne\diablo\class.cpp | 41 | first defined here | ||=== Build finished : 8 errors , 19 warnings ===| |
|
DejaVu |
» 2009-07-21 22:25:20 Poczytaj jak się dzieli kod na kilka plików. Wygląda na to, że używasz właśnie tej techniki. Pliki z deklaracjami klas powinny być w *.hpp, z definicjami metod *.cpp. Do tego na początku plików *.hpp powinno być #pragma once lub odpowiedni #ifndef zrobiony. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-07-21 22:35:01 W kursie jest mowa o plikach nagłówkowych i źródłowych, ale te pierwsze wydają mi się bez sensu, bo chyba można wszystko definiować w plikach źródłowych? |
|
DejaVu |
» 2009-07-21 22:37:09 Jeśli uważasz, że wiesz lepiej... to ja Ci pomóc nie mogę :) |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-07-21 22:49:27 Nie uważam, że wiem lepiej, a wręcz przeciwnie. Staram się tylko zrozumieć dlaczego należy definiować wszystko w pliku nagłówkowym (hpp), zamiast bezpośrednio w pliku źródłowym (cpp). |
|
DejaVu |
» 2009-07-21 23:08:17 A czy odpowiedź 'żeby działało' będzie dla Ciebie zadowalająca...? Przeczytaj rozdział dlaczego deklaracje umieszcza się w pliku *.hpp, a definicje w *.cpp. To tak jak byś się pytał dlaczego się robi fundamenty pod budynek, skoro można by było postawić odrazu ściany... pytanie o ile jest sensowne o tyle budowanie budynku bez fundamentów już nie.
Taką technikę tworzenia kodu stosuje się od zalania dziejów w programowaniu. Napotkałeś na problem, ponieważ chcesz coś zrobić po swojemu, a nie wg. standardów wypracowanych latami (który między innymi po to nawiasem mówiąc został zrobiony) i piszesz, że plik *.hpp jest wg. Ciebie zbędny... im więcej będziesz pisał dużych projektów tym bardziej docenisz istnienie plików nagłówkowych *.hpp. |
|
DejaVu |
» 2009-07-22 00:04:59 Człowiek uczy się całe życie ;p dzięki :)
Dante: usuń lub popraw możliwość wpisania [/code zwin] -> to nie działa |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-07-22 10:27:19 Po prostu myślałem, że jest w tym jakiś głębszy sens, no ale jeżeli jest to po prostu standard kodowania to nie mam więcej pytań :) Tematu nie zamykam, bo nie wiem czy to naprawi mój pierwszy problem. //----------------- Problem jest nadal. main.cpp: #include <allegro.h> #include "class.cpp"
int main() { } END_OF_MAIN();
class.cpp: #include <string> #include <allegro.h> #include "class.hpp" using namespace std;
cObject::cObject() { string m_strName = "Object"; int m_iPositionX = 0; int m_iPositionY = 0; BITMAP * m_bmImage = create_bitmap( 50, 50 ); int m_iWidth = 50; int m_iHeight = 50; }
cObject::cObject( string strName, int iPositionX, int iPositionY, string strPathOfFile ) { string m_strName = strName; int m_iPositionX = iPositionX; int m_iPositionY = iPositionY; BITMAP * m_bmImage = load_bmp( strPathOfFile.c_str(), default_palette ); int m_iWidth = m_bmImage->w; int m_iHeight = m_bmImage->h; }
class.hpp: #ifndef class_hpp #define class_hpp
using namespace std;
class cObject { public: string m_strName; int m_iPositionX; int m_iPositionY; BITMAP * m_bmImage; int m_iWidth; int m_iHeight; cObject(); cObject( string, int, int, string ); };
class cCharacter : public cObject { public: int m_iHP; int m_iAttack; int m_iDefense; int m_iInjuryMin; int m_iInjuryMax; int m_iSpeed; };
class cMonster : public cCharacter { };
class cPlayer : public cCharacter { };
#endif
Logi są takie jak poprzednio. |
|
« 1 » 2 3 4 5 6 7 |